C 언어에서는 매개변수가 항상 값에 의해 전달됩니다. 즉 호출 코드의 값 복사본이 함수에 전달됩니다. 함수 외부의 변수 값을 변경해야 하는 경우 포인터에 의한 전달을 사용합니다.
스칼라(예: int)를 전달할 때 함수는 자신의 복사본을 받습니다:
void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, 변경되지 않음! }
변수 값을 변경하기 위해 포인터를 사용합니다:
void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, 값이 변경됨! }
배열이 함수의 매개변수로 참조에 의해 전달되는가?
많은 사람들이 "참조에 의해"라고 대답하지만 C에서는 함수 서명에서 배열이 참조에 의해 전달될 수 없으며 사실상 포인터로 전환됩니다.
올바른 답변:
배열이 함수에 전달될 때 실제로는 그 첫 번째 요소에 대한 포인터가 전달됩니다. 즉 호출 함수는 배열의 실제 크기를 알지 못하며 배열 요소의 모든 변경은 원래 배열에 반영됩니다.
void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0]은 100이 됨! }
역사
int arr[10]으로 선언된 배열의 값을 업데이트했지만 호출 코드에서 배열은 더 작은 크기였습니다. 함수가 실제 크기를 알지 못했기 때문에 버퍼 오버플로우와 메모리 손상이 발생했습니다.