elevne's Study Note
C 공부 (6: Call by reference) 본문
C 에서 함수호출 시 전달되는 인자의 값은 매개변수에 복사가 된다. 실제로 함수에 전달되는 값은 변수 그 자체가 아니라, 그 변수에 저장된 값인 것이다. 함수에 사용되는 변수는, 기존의 정의해둔 변수와 값만 같은 별개의 변수라고 생각하면 된다.
C 에서는 함수호출 시 인자로 배열을 통째로 전달해줄 수 없다. 매개변수로 배열을 선언할 수 없기 때문이다. 매개변수로 배열을 선언하는 것이 허용되지 않기 때문에, 배열의 주소 값을 전달하는 방식을 사용한다. 이 때, 포인터 변수를 사용할 수 있는 것이다. 아래와 같은 예제코드를 작성해볼 수 있다.
#include <stdio.h>
void showArrayElem(int* param, int len)
{
int i;
for (i=0; i<len; i++){
printf("%d ", param[i]);
}
printf("\n");
}
void addArrayElem(int* param, int len, int add)
{
int i;
for (i = 0; i < len; i++){
param[i] += add;
}
}
int main() {
int arr1[3] = {1, 2, 3};
int arr2[5] = {4, 5, 6, 7, 8};
showArrayElem(arr1, sizeof(arr1) / sizeof(int));
addArrayElem(arr1, sizeof(arr1) / sizeof(int), 5);
showArrayElem(arr1, sizeof(arr1) / sizeof(int));
showArrayElem(arr2, sizeof(arr2) / sizeof(int));
addArrayElem(arr2, sizeof(arr2) / sizeof(int), 5);
showArrayElem(arr2, sizeof(arr2) / sizeof(int));
return 0;
}
위와 같이 이는 변수를 복사해서 사용하는 것이 아니라 주소를 참조하고 있기 때문에 함수 내에서 배열 내의 값을 변경해줄 수도 있는 것이다. 이렇게 메모리의 접근에 사용되는 주소 값을 전달하는 형태의 함수호출을 Call-by-reference 라고 부르며, 반대로 단순히 값을 전달하는 형태의 함수호출은 Call-by-value 라고 한다. Call-by-reference 함수를 배열이 아닌 것을 활용하여 작성해보자면 아래와 같이 해볼 수도 있다.
#include <stdio.h>
void Swap(int* ptr1, int* ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
int main() {
int num1 = 11;
int num2 = 22;
printf("num1: %d, num2: %d\n", num1, num2);
Swap(&num1, &num2);
printf("num1: %d, num2: %d", num1, num2);
return 0;
}
Reference:
윤성우의 열혈 c 프로그래밍
'Backend > C' 카테고리의 다른 글
C 공부 (5: 포인터(2)) (0) | 2023.02.03 |
---|---|
C 공부 (4: 포인터(1)) (0) | 2023.01.29 |
C 공부 (3: 배열) (1) | 2023.01.28 |
C 공부 (2: 반복문, static) (0) | 2023.01.27 |
C 공부 (1: ~ Casting) (0) | 2023.01.26 |