본문 바로가기
공부,일/c언어

함수포인터

by fromnothing1 2021. 6. 2.

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 하는 함수의 함수포인터

 

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

댓글