Search

11. 포인터와 함수

포인터와 함수

함수의 인자로 배열 전달하기

배열의 각 요소를 출력하거나 특정 계산을 수행하는 함수가 있을 때, 해당 함수로 배열을 전달 하려고 합니다. 함수를 선언할 때, 함수의 인자 값에는 전달 받으려는 자료형을 선언해줘야 합니다. 마찬가지로, 배열을 전달하려 할 때, 배열을 받기 위한 자료형을 선언해줘야 합니다.
#include <stdio.h> void showArr(int * arr, int len){ // int * arr 대신, int arr[] 도 가능 for(int i=0; i<len; i++){ printf("%d ", arr[i]); } printf("\n"); } int main(void) { int arr[5] = {11, 22, 33, 44, 55}; showArr(arr, sizeof(arr)/sizeof(int)); return 0; } /* 11 22 33 44 55 */
C
복사
위 함수의 경우 배열을 전달받기 위한 인자는 int * arr 형태로 정의되어 있습니다. 그 이유는 배열의 이름이 배열의 첫 번째 요소를 가리키는 주소이기 때문입니다.
위 코드에서 int len 은 배열의 길이를 나타냅니다. 배열의 길이를 전달하는 이유는 함수 내에서 인자로 전달된 배열의 길이를 계산할 수 없기 때문입니다. 더 자세히 설명하자면, 배열이 함수에 전달될 때 ‘값에 의한 전달’이 아닌 ‘주소에 의한 전달’로 이루어지기 때문입니다. 따라서, 함수에 배열을 전달하면 실제로 전달되는 것은 배열의 첫 번째 요소의 주소를 전달하고 함수 내부에서는 이 주소만을 이용하여 배열을 조작할 수 있습니다.

Call-by-Value, Call-by-Reference

Call-By-Value

Call-by-Value 방식은 함수를 호출할 때 인자로 변수의 값을 복사하여 전달하는 방식입니다. 이 방법에서는 복사된 인자를 함수 내에서 처리하기 때문에 원래 변수의 값이 변경되지 않습니다. 따라서 함수 내부에서 인자의 값이 변경되더라도 호출자의 실제 인자 값에는 영향을 미치지 않습니다.
배열을 이용한 Call-by-Value는 실제로 가능하지 않습니다. 배열 이름은 배열의 첫 번째 요소를 가리키는 주소이며, 함수에 배열 이름을 전달하면 주소가 전달되므로, 이는 Call-by-Reference와 같습니다.
#include <stdio.h> void changeValue(int x) // Call-by-Value { x = 20; } int main(void) { int x = 10; printf("Before function call, x = %d\n", x); changeValue(x); printf("After function call, x = %d\n", x); return 0; } /* Before function call, x = 10 After function call, x = 10 */
C
복사

Call-By-Reference

Call-by-Reference 방식은 함수를 호출할 때 인자로 변수의 주소를 전달하는 방식입니다. 이 방법에서는 함수 내에서 원래 변수의 메모리에 접근하므로 원래 변수의 값이 변경될 수 있습니다. 따라서 함수 내부에서 인자 값이 변경되면 호출자의 실제 인자 값도 변경됩니다.
배열의 이름이 배열의 첫 번째 요소를 가리키는 주소이므로, 배열을 함수의 인자로 전달하면 Call-by-Reference가 됩니다. 함수 내에서 이 주소를 이용하여 배열의 요소를 변경하면 원래 배열의 값도 변경됩니다.
#include <stdio.h> void changeValue(int* pX) // Call-by-Reference { *pX = 20; } int main(void) { int x = 10; printf("Before function call, x = %d\n", x); changeValue(&x); printf("After function call, x = %d\n", x); return 0; } /* Before function call, x = 10 After function call, x = 20 */
C
복사

예제 출력

$ gcc -o pointer_and_function.o pointer_and_function.c $ ./pointer_and_function.o [*] 함수의 인자 값으로 배열을 전달 11 22 33 44 55 [*] Call-by-Value Before function call, x = 10 After function call, x = 10 [*] Call-by-Reference Before function call, x = 10 After function call, x = 20 [*] Call-by-Reference with Array Before modification: 10 20 30 40 After modification: 11 21 31 41
Shell
복사