c 언어에서는 함수또한 주소를 가지고 있다.
때문에 함수 또한 주소와 type 만 알고 있다면 주소로 호출하고 사용이 가능해진다.
#include <stdio.h>
int add(int a, int b) // int형 반환값, int형 매개변수 두 개
{
return a + b;
}
int (*retunrAdd(int a ,int b ))(int ,int ) // 함수 포인터를 반환값으로 지정
{
printf("retunrAdd 정상작동 : %d, %d \n",a,b);
return add; // add 함수의 메모리 주소를 반환
}
int GetAdd(int (*p)(int, int)) // 함수 포인터를 매개변수로 받음
{
printf("GetAdd 정상작동 %d\n", p(1, 2));
return 0;
}
int (*GetretunrAdd(int (*p)(int, int)))(int, int) // 함수 포인터를 반환값으로 지정 하고 함수 포인터를 매개변수로 받음
{
printf("GetretunrAdd 정상작동 : %p \n", p);
return p; // add 함수의 메모리 주소를 반환
}
int main()
{
int (*p)(int, int); // add type 함수 포인터
int( * (*p1)(int, int))(int, int); // 함수 포인터를 return 하는 함수의 함수 포인터
int (*p2)(int (*)(int, int)); // 함수포인터를 매개 변수로 하는 함수의 함수 포인터
int (*(*p3)(int (*p)(int, int)))(int, int); //함수 포인터를 반환값으로 지정 하고 함수 포인터를 매개변수로 하는 함수의 함수 포인터
p = add;
p1 = retunrAdd;
p2 = GetAdd;
printf("add(10, 20) : %d\n", add(10, 20));
printf("p(10, 20) : %d\n", p(10, 20));
printf("retunrAdd : %p\n", retunrAdd);
printf("p1 : %p\n", p1);
GetAdd(p);
p2(p);
printf("retunrAdd : %p\n", retunrAdd);
printf("retunrAdd : %p\n", retunrAdd);
return 0;
}
어떤 식으로 type 이 결정 된는지는 아래그림에서 설명하겠다.
함수의 type 은 간단하게 식별자 부분을 (*) 치환 해주면 된다.
이제 심화로 나아가 함수포인터를 매개변수로 받고 return 하는 경우에 대해 다루겠다.
함수 포인터 return 의 경우 기존의 문법과 비교해 차이가 있는편이다.
return 하는 함수의 형태가 함수 포인터를 감싸고 있는 형태의 문법이다.
'공부,일 > c언어' 카테고리의 다른 글
비트필드 (0) | 2021.06.03 |
---|---|
구조체 (0) | 2021.06.03 |
sizeof 와 포인터 & 배열의 data type (0) | 2021.06.01 |
void pointer , malloc (0) | 2021.06.01 |
Code 영역 (0) | 2021.05.31 |
댓글