본문으로 건너뛰기

함수와 포인터

함수 포인터

함수는 메모리상에 코드 블록으로 존재하며, 해당 주소를 저장할 수 있다.

int add(int a, int b) {
return a + b;
}

int (*fp)(int, int); // 함수 포인터 선언
fp = add; // 함수 주소 할당
int result = fp(3, 5); // 간접 호출 -> 8
  • int (*fp)(int, int): int 2개를 받아서 int 하나를 반환하는 함수의 주소를 저장하는 포인터의 선언
  • fp = add: add함수의 주소를 포인터 변수에 할당
  • fp(3, 5)add(3, 5)와 동일하다.

함수 이름 전달(Callback)

  • 함수 이름을 인자로 전달하면 자동으로 함수 포인터로 변환된다.
int add(int a, int b) {
return a + b;
}

// operation은 함수 매개변수
int excute(int (*operation)(int, int), int a, int b) {
fp(a, b);
}

// add 함수의 주소를 전달
int x = excute(add, 2, 3); // x = 5

add == &add은 항상 성립
따라서 excute(add, 2, 3)excute(&add, 2, 3)은 동일하게 동작함

포인터 인자 전달(Call by Pointer)

  • C에서 함수 인자는 값에 의한 호출이므로, 인자로 넘긴 값 자체는 복사된다.
  • 하지만 포인터로 인자를 전달하면, 원본 메모리 주소를 넘겨 값을 직접 수정할 수 있음
void setZero(int* ptr) {
*ptr = 0;
}

int x = 5;
setZero(&x);
printf("%d", x); // 0