C에서 참조를 통한 함수 호출

안녕하세요, 미래의 프로그래머 여러분! 오늘 우리는 C 프로그래밍의 세계로 흥미로운 여정을 떠납니다. 특히 " 함수 호출에 대한 참조 " 개념을 탐구하겠습니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요; 저는 수 년 동안 수많은 학생들을 가르쳐온 경험을 바탕으로 단계별로 안내해 드리겠습니다. 그러니 마음에 드는 음료를 한 잔 챙기고 편안하게 앉아 따라오세요!

C - Function call by reference

C에서 주소 연산자 (&)

참조를 통한 함수 호출을 이해하기 전에, C에서 매우 중요한 기호 하나를 알아보겠습니다: 앰퍼샌드 (&). 이 작은 문자는 "주소 연산자"로 알려져 있으며, 컴퓨터의 메모리에서 변수의 비밀 위치를 밝혀내는 마법의 지팡이 같은东西입니다.

간단한 예를 보겠습니다:

#include <stdio.h>

int main() {
int age = 25;
printf("age의 값은: %d\n", age);
printf("age의 주소는: %p\n", &age);
return 0;
}

이 코드에서 우리는 age의 값을 출력하는 것뿐만 아니라 그 메모리 주소도 출력합니다. %p 형식 지시자는 메모리 주소를 출력하는 데 사용됩니다.

이 프로그램을 실행하면 다음과 같은 것을 볼 수 있습니다:

age의 값은: 25
age의 주소는: 0x7ffd5e8e9944

"age의 주소는:" 뒤에 이상한 숫자는 실제 메모리 주소입니다! 컴퓨터가 age 변수를 저장하기로 한 위치입니다. 이를 컴퓨터의 메모리 광대한 동네에서 변수의 집 주소라고 생각해 보세요.

C에서 포인터는 무엇인가요?

이제 변수의 주소를 찾는 방법을 알고 있으므로, 포인터에 대해 이야기해 보겠습니다. 만약 주소가 집 주소라면, 포인터는 그 주소로 안내해주는 GPS 나비게이터 같은 것입니다.

C에서 포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 선언할 때는 별표 (*) 기호를 사용합니다.

다음은 예제입니다:

#include <stdio.h>

int main() {
int age = 25;
int *ptr_age = &age;

printf("age의 값은: %d\n", age);
printf("age의 주소는: %p\n", &age);
printf("ptr_age의 값은: %p\n", ptr_age);
printf("ptr_age가 가리키는 값은: %d\n", *ptr_age);

return 0;
}

이 코드에서 ptr_ageage의 주소를 저장하는 포인터입니다. *ptr_age를 사용할 때는 ptr_age가 가리키는 주소에 저장된 값을 요청하는 것입니다.

출력은 다음과 같을 수 있습니다:

age의 값은: 25
age의 주소는: 0x7ffd5e8e9944
ptr_age의 값은: 0x7ffd5e8e9944
ptr_age가 가리키는 값은: 25

ptr_age에 저장된 주소가 age의 주소와 일치함을 보시면, ptr_ageage를 가리키고 있음을 알 수 있습니다!

C에서 참조를 통한 호출은 어떻게 작동하나요?

이제 포인터를 이해했으므로, 함수 호출에 대한 참조를 탐구해 보겠습니다. 참조를 통한 함수 호출을 할 때, 우리는 변수의 값을 대신 그 주소를 함수에 전달합니다. 이렇게 하면 함수가 원래 변수를 직접 수정할 수 있습니다.

예제를 보겠습니다:

#include <stdio.h>

void increment(int *num) {
(*num)++;
}

int main() {
int x = 5;
printf("인crement 전: x = %d\n", x);
increment(&x);
printf("인crement 후: x = %d\n", x);
return 0;
}

이 코드에서 우리는 x의 주소를 increment 함수에 전달합니다. 함수는 이 주소를 사용하여 x의 값을 직접 수정합니다.

출력은 다음과 같습니다:

인crement 전: x = 5
인crement 후: x = 6

increment 함수는 main 함수에서 x의 값을 변경할 수 있었던 이유는 x의 주소를 받았기 때문입니다.

값을 통한 호출과 참조를 통한 호출을 혼합

C에서는 값을 통한 호출과 참조를 통한 호출을 동일한 함수에서 혼합할 수 있습니다. 이는 일부 매개변수를 수정하고 다른 매개변수는 수정하지 않고 싶을 때 유용합니다.

다음은 예제입니다:

#include <stdio.h>

void modify(int *a, int b, int *c) {
(*a)++;
b++;
(*c)++;
}

int main() {
int x = 1, y = 2, z = 3;
printf("modify 전: x = %d, y = %d, z = %d\n", x, y, z);
modify(&x, y, &z);
printf("modify 후: x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}

이 예제에서 xz는 참조를 통해 전달되었고, y는 값을 통해 전달되었습니다.

출력은 다음과 같습니다:

modify 전: x = 1, y = 2, z = 3
modify 후: x = 2, y = 2, z = 4

xz가 변경되었지만 y는 그대로인 것을 보시면, 함수가 y의 값을 복사밖에 못했기 때문입니다.

다음은 값을 통한 호출과 참조를 통한 호출의 차이를 요약한 표입니다:

요소 값을 통한 호출 참조를 통한 호출
전달되는 것 값의 복사 변수의 주소
원래 변수 수정 가능 여부 불가능 가능
문법 function(variable) function(&variable)
함수 매개변수 일반 변수 포인터

그렇게 되면! C에서 함수 호출에 대한 참조를 이해한 것입니다. 기억하시라, 새로운 기술을 배우는 것은 연습이 관键입니다. 참조를 통한 함수 호출을 사용하는 자신만의 함수를 작성하고 다양한 시나리오를 실험해 보세요. 얼마 지나지 않아 메모리 주소를 마스터하실 것입니다!

즐겁게 코딩하시고, 포인터가 항상 올바른 방향을 가리키길 바랍니다!

Credits: Image by storyset