함수 포인터
함수 포인터
함수 포인터란!?
함수의 주소를 가리키는 포인터입니다!
함수의 주소는 어떻게 표현할까요?
int add(int a, int b){
return a + b;
}
int main(){
printf("함수의 주소 %x, %x, %x\n", add, &add, *add); // 다 같은 주소 출력
printf("함수 호출 %d %d %d", add(2,3), (&add)(2, 3), (*add)(2, 3)); // 모두 같은 값 출력
}
add나 &add, *add 모두 같은 주소를 리턴하고, 그것을 가지고 호출을 해도 같은 함수를 호출합니다
(이유는 잘 모릅니다...)
함수 포인터의 선언
함수의 리턴과 넘겨지는 인자의 타입을 똑같이 선언하면됩니다!
아래 예시를 보면 금방 이해되요
int add(int a, int b){
return a + b;
}
// 함수의 리턴과 넘겨지는 인자들을 함수와 똑같이 선언하면 됩니다!
int (*ptr_add_func)(int, int); // add의 리턴은 int, add의 인자의 타입은 int, int
ptr_add_func = add; //가능
ptr_add_func = &add; //가능
ptr_add_func = *add; // 가능
그 다음 실행은 함수와 똑같습니다
printf("%d", ptr_add_func(3, 2)); // add(2, 3)과 같습니다
함수 포인터를 쓰는 이유는?!
아마 함수를 인자로 넘겨주기 위해서 일것입니다.. (검색해보면 나옵니다..ㅎ)
함수를 언제 인자로 넘겨주냐면, 콜백함수 일때 함수를 인자로 넘겨서 활용합니다
예시는 C++에서 sort 함수입니다
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(int a, int b){
printf("Call Cmp by sort function!\n"); //
return a > b;
}
int main(){
vector<int> v = {3, 5, 10, 98, 23, 12, 258, 1, -3};
sort(v.begin(), v.end(), cmp); // 인자로 cmp를 넘겨주겟따!
for(int i : v) printf("%d ", i);
}
위의 코드에서 vector
v.begin()는 v의 시작, v.end()는 끝, cmp는 정렬 기준을 나타냅니다
결과적으로 v의 시작부터 끝까지 정렬을 하는데 기준을 cmp 함수로 정하겠다는 것입니다.
누가 크고 누가 작은지를 알아야하기 정렬을 할 수 있기 때문에 비교가 필수입니다
그래서 sort함수가 비교를 할 때, cmp 함수를 호출해서 비교를 하면서 정렬을 합니다
cmp함수는 직접 불러지는 게 아니라, 다른 함수의 인자로 넘어가서 불려진다 -> Call Back 함수
또 함수포인터를 쓰는 이유는 함수를 배열 안에 넣을 수 있다는 점입니다.
배열 안에 함수를 넣는다는게 아니라 함수 포인터를 넣어서 부를 수 있는 거죠
int add(int a, int b){ return a + b;}
int sub(int a, int b){ return a - b;}
int mul(int a, int b){ return a * b;}
int divide(int a, int b){ return a / b;}
int (*ptr_func_list[4])(int, int) = {add, sub, mul, divide};
printf("%d ", ptr_func_list[1](3, 2); // sub(3, 2) 와 같은 결과
ptr_func_list의 선언부를 해석해보면
ptr_func_list는 4칸짜리 배열이고 배열 안에는 포인터가 있는데
그 포인터는 인자를 (int ,int)로 받고 int를 리턴하는 함수입니다!
글로 쓰면 이해가 안될 수 있으므로 그림으로 보겠습니다.
그림을 보고 나서 글을 읽어보면 이해가 될 수도 있습니다..
선언하는 방법과 해석은 나중에 다시 포스트 하겠습니다.
끝!
질문이나 잘못된 점을 댓글 달아주시면 바로 피드백하겠습니다!