함수와 포인터
함수 포인터
함수는 메모리상에 코드 블록으로 존재하며, 해당 주소를 저장할 수 있다.
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