。공부 。

[C언어] 함수이름도 포인터?

kyoe 2008. 1. 27. 20:57
혹시 함수도 주소값을 갖고 있다는거 아시나요?
그럼 함수의 자료형만 안다면 함수역시 포인터가 되는거 아닐까요?
그렇습니다 함수역시 주소값을 갖고 있고 자료형또한 갖고 있습니다.
그럼 주소는 어떻게 되고 자료형은 무엇을 갖는지 그 자료형을 어떻게 알아 내는지 를 알아보죠
간단히 함수의 포인터 타입을 알아보자는겁니다.

void show(int a){
    printf("%d \n",a);
}
위와같은 함수가 있습니다 간단히 int형 변수를 매개변수로 받아 출력을 하는 show합수지요
함수의 자료형을 얻기 위해서 우린 함수의 리턴타입과 매개변수타입이 무엇인지를 알아야 합니다.
위의 show 함수의 리턴타입은 void형 이고 매개변수는 int형이되겠지요..
그럼 show의 포인터 를 만들이렇게 됩니다.
void(*show_ptr)(int) = show;
위의 문장을 보면 잘 이해가 안가실겁니다. 위의 포인터타입을 영어해석(?) 하듯 읽어 보지요.
show 함수의 포인터 show_ptr을 선언하는데 리턴타입은void형이고 매개변수는 int형인 포인터 *show_ptr을 선언.

음... 어렵나요? 그럼 이렇게 비교해보죠
void show(int a)         --> show함수        
void(*show_ptr)(int)    --> 포인터 show_ptr
어떻습니까 둘이 많이 닮아있죠? 다 똑같은데 함수에 괄호()와 이름앞에 '*'붙은거 뺴곤 똑같다는것을 알수있습니다.

다른 예를 한번더 들어보죠.
int fct(char *str, int aa)       
void(*show_ftc2)(char*, int)
이제 좀 감이 오시죠? 이렇듯 함수를 포인터로 선언한것을 우리는 함수포인터라 합니다.
하지만 둘이 완전히 같은것은 아닙니다 ..

[ 함수와 함수포인터의 차이 ]
        함수           --> 포인터 상수
        함수 포인터 --> 포인터 변수

[ 함수포인터 간단한 예제]
#include <stdio.h>

void show(int a){
    printf("%d \n",a);
}

int main(void){
    int aa = 10;
    void(*show_ptr)(int) = show;
   
    printf("%d %d \n",show,show_ptr);

    show(aa);
    show_ptr(aa);

    return 0;
}

함수의 정체를 알았기 때문에 우린 이제 show() 함수를 이렇게 이렇게 읽어야 될겁니다. show라는 포인터가 가르키를 함수를 호출하면서 인자값으로 상수 10을 전달하라고 말이죠.