C 프로그래밍: 주소와 포인터를 함수에 전달하기 – 실전 가이드
C 프로그래밍: 주소와 포인터를 함수에 전달하기
C 언어에서 메모리 주소와 포인터를 함수에 전달하는 방법을 명확한 예제와 전문가 설명으로 마스터하세요.
C에서 값 대신 주소를 전달하면 함수가 원래 변수를 직접 조작할 수 있습니다. 이 기법을 포인터 전달(pointer passing)이라고 하며, 효율적인 코드와 범위를 넘어선 데이터 수정에 필수적입니다.
예제 1: 참조에 의한 두 정수 교환
#include <stdio.h>
void swap(int *n1, int *n2);
int main(void) {
int num1 = 5, num2 = 10;
/* num1과 num2의 주소 전달 */
swap(&num1, &num2);
printf("num1 = %d\n", num1);
printf("num2 = %d", num2);
return 0;
}
void swap(int *n1, int *n2) {
int temp = *n1;
*n1 = *n2;
*n2 = temp;
}
이 프로그램을 실행하면:
num1 = 10
num2 = 5
swap() 함수는 원래 num1과 num2 변수를 가리키는 포인터 n1과 n2를 받습니다. 이 포인터들을 역참조(*n1, *n2)함으로써 함수는 메모리에 저장된 실제 값을 교환하므로, main()에서 업데이트된 숫자를 볼 수 있습니다. swap()이 void를 반환하는 이유는 인자를 직접 수정하기 때문입니다.
예제 2: 포인터를 통한 값 증가
#include <stdio.h>
void addOne(int *ptr) {
(*ptr)++; /* 주어진 주소의 값 증가 */
}
int main(void) {
int i = 10;
int *p = &i;
addOne(p);
printf("%d", *p); /* 11 출력 */
return 0;
}
여기서 p는 i의 주소를 가집니다. addOne() 함수는 같은 주소를 받아 역참조하고 내부 값을 증가시킵니다. 호출 후 *p(따라서 i)는 새로운 값 11을 반영합니다.
이 예제들은 포인터 전달의 강력함을 보여줍니다: 함수는 자신의 범위 밖에서 정의된 변수를 변경할 수 있어, 불필요한 복사 없이 효율적인 데이터 조작이 가능합니다.