함수 포인터는 말 그대로 함수를 가리키는 포인터입니다. 함수 포인터는 다음과 같이 정의합니다.
리턴 타입 (*함수 포인터 명)(인수);
int (*add)(int a, int b);
보다시피 일반 함수 형식에 (*)이 추가된 모습입니다.
int ADD(int a, int b) {
return a + b;
}
int main() {
int (*add)(int a, int b);
add = ADD;//int (*add)(int a, int b) = ADD;로 정의와 동시에 초기화가능합니다.
printf("%d\n", add(1, 2));
return 0;
}
add는 함수가 아니라 함수 포인터라서 정의되자마자 바로 사용할 수 없고 같은 리턴 타입과 인수를 가진 함수 ADD를 대입시켜야 사용할 수 있습니다.
그리고 add는 함수가 아니라 함수 포인터라서 함수를 호출할 때 포인터가 가리키는 값을 가져오는 연산자 *를 사용하여 (*add)(1, 2);(()가 연산자 우선순위가 *보다 더 높아서 괄호가 필요합니다.) 형식으로 호출해야 될 것 같지만 C++는 이를 줄여 쓰는 것을 허용하기 때문에 둘 다 맞습니다.
함수 포인터를 캐스팅하기 위해서는 (리턴 타입 (*)(인수)) 형식으로 씁니다.
int (*add)(int a, int b);
int (*abs)(int a);
add = (int (*)(int, int))abs;//(int (*)(int))를 (int (*)(int, int))로 변환시켜 대입
함수 포인터를 함수 인수로 사용할 수 있습니다. 함수 포인터 변수를 함수 인수 자리에 넣어주면 됩니다.
int Calc(int a, int b, int (*add)(int, int)) {
return add(a , b);
}
int ADD(int a, int b) {
return a + b;
}
int main() {
printf("%d\n", Calc(1, 2, ADD));
return 0;
}
리턴 타입이 함수 포인터가 될 수 있는데 형식은 다음과 같습니다.
(함수 포인터의 리턴 타입) (*함수명(인수))(함수 포인터 인수)
int ADD(int a, int b) {
return a + b;
}
int SUB(int a, int b) {
return a - b;
}
int (*Calc(int num))(int, int) {//함수 포인터가 리턴타입인 함수입니다.
if(num == 0) {
return ADD;
} else {
return SUB;
}
}
int main() {
int (*add)(int a, int b) = Calc(0);
return 0;
}
'C, C++' 카테고리의 다른 글
goto (0) | 2019.12.27 |
---|---|
typedef (0) | 2019.12.24 |
열거형 (0) | 2019.12.21 |
#pragma warning (2) | 2019.12.20 |
#pragma once (0) | 2019.12.19 |