본문 바로가기
공부/C언어

[C언어] 함수와 배열, 그리고 포인터의 관계 정리, 함수의 호출방식

by 현구원 2025. 5. 11.
반응형

C 언어에서 배열을 함수에 전달하는 방식은 흔히 포인터 개념과 함께 이해해야 합니다. 이번 글에서는 배열을 함수 인자로 전달하는 방법과 함께, Call-by-valueCall-by-reference의 차이를 정리해보겠습니다.

C 언어에서 배열은 함수에 그대로 전달할 수 없지만, 배열의 주소는 전달할 수 있습니다. 이와 관련된 개념과 함수 호출 방식의 차이를 정리해보겠습니다.


1. 함수 인자로 배열을 전달하는 방법

  • 함수 호출 시, 전달되는 것은 실제 인자 자체가 아닌 인자에 저장된 값이 복사됩니다.
  • C 언어에서는 배열 자체를 매개변수로 받을 수는 없지만, 배열의 주소 값을 전달하여 배열을 다룰 수 있습니다.
  • 이를 위해 함수의 매개변수를 포인터 변수로 선언합니다.
void SimpleFunc(int * param) {
    // param은 배열의 주소를 받아 배열처럼 사용 가능
}
  • 다음 두 함수 선언은 동일하게 작동합니다.
void SimpleFunc(int * param);
void SimpleFunc(int param[]);
  • 함수 내부에서는 포인터를 통해 배열의 요소 값을 변경할 수 있으며, 이는 원래 배열에도 영향을 미칩니다.

2. Call-by-value vs Call-by-reference

Call-by-value

  • 단순히 값만 전달하는 방식입니다.
  • 함수 내부에서 값을 변경해도 원본에는 영향이 없습니다.
void Func(int val) {
    val = 10;  // 원본 변수는 바뀌지 않음
}

Call-by-reference

  • 주소 값을 전달하여, 함수 내에서 실제 메모리 공간에 접근할 수 있는 방식입니다.
  • 함수 내부에서 값을 변경하면 원본 변수도 함께 바뀝니다.
void Func(int * ptr) {
    *ptr = 10;  // 원본 변수의 값이 변경됨
}

 


예제

문제 1

변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고, 이를 호출하는 main 함수를 작성해보자. 단, 여기서 다음 두 가지 형태로 함수를 정의해야 한다.

· Call - by - value 기반의 SquareByValue 함수

· Call - by - refernece 기반의 SquareByReference 함수

SquareByValue 함수는 인자로 전달 된 값의 제곱을 반환해야 하며, SquareByReference 함수는 정수가 저장되어 있는 변수의 주소 값을 인자로 받아서 해당 변수에 저장된 값의 제곱을 그 변수에 다시 저장해야 한다.

문제 2

세 변수에 저장된 값을 서로 뒤바꾸는 함수를 정의해보자. 예를 들어서 함수의 이름이 Swap3라하면, 다음의 형태로 함수가 호출되어야 한다.

Swap3(&num1, &num2, &num3);

그리고 함수호출의 결과로 num1에 저장된 값은 num2에, num2에 저장된 값은 num3에, 그리고 num3에 저장된 값은 num1에 저장되어야 한다.


✅ 정리

  • 배열은 함수에 직접 전달되지 않고 주소 값만 전달됩니다.
  • int param[]와 int * param은 본질적으로 동일합니다.
  • Call-by-reference는 메모리 주소를 통해 원본 데이터를 수정할 수 있어, 배열이나 구조체를 다룰 때 자주 사용됩니다.
반응형