-
함수 포인터프로그래밍/C, C++ 2019. 4. 26. 00:06
함수 포인터
함수 포인터란!?
함수의 주소를 가리키는 포인터입니다!
함수의 주소는 어떻게 표현할까요?
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는 int 배열인데 사이즈가 늘어나는 배열이라고 생각하시면 편합니다
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를 리턴하는 함수입니다!
글로 쓰면 이해가 안될 수 있으므로 그림으로 보겠습니다.그림을 보고 나서 글을 읽어보면 이해가 될 수도 있습니다..
선언하는 방법과 해석은 나중에 다시 포스트 하겠습니다.
끝!
질문이나 잘못된 점을 댓글 달아주시면 바로 피드백하겠습니다!
'프로그래밍 > C, C++' 카테고리의 다른 글
포인터 타입 캐스팅(void 포인터) (0) 2019.05.02 포인터 타입 캐스팅 (0) 2019.04.30 포인터와 배열1 (0) 2019.04.21 포인터와 배열2 (0) 2019.04.21 포인터 연산 (0) 2019.04.17 댓글