C언어 함수 포인터와 void 포인터

프로그래밍/C 2019.04.18 댓글 Plorence

함수 포인터

함수의 이름은 포인터입니다. 마치 배열의 이름이 포인터인듯이 함수의 이름도 포인터입니다.
이걸 함수 포인터라고 하고 배열의 이름과 마찬가지로 상수 형태입니다.

 

함수 포인터의 특징

  • 함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다(함수 포인터).
  • 함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장할 수 있다.
  • 함수 포인터 변수를 선언할려면 함수 포인터의 형(type)을 알아야한다.

함수 포인터의 형

함수 포인터의 형 정보에는 반환형과 매개변수 선언에 대한 정보를 담기로 약속합니다.
즉, 함수의 반환형과 매개변수 선언이 동일한 두 함수의 함수 포인터 형은 일치합니다.
함수 포인터의 형을 함수 시그니처(function signature)라고도 부르는데,이건 C++ 함수 오버로딩에서 설명합니다.

 

함수 포인터 변수의 선언

ReturnType (*Name) (FunctionSignature)

문법은 위와 같습니다.

예시를 하나 들어보자면

int fet (int num) {
    return num;
}

위와같은 함수가 있을때

int (*ptr) (int);

함수 포인터는 이렇게 선언합니다.

#include <stdio.h>
int fet(int num) {
       return num;
}
int main(void) {
       int(*ptr) (int) = fet;
       printf("%d \n", ptr(10));
       printf("%d \n", fet(10));
}

포인터랑 똑같이 함수의 주소를 포인터에 대입하여 사용합니다.

 

쓰는 이유

C언어에서 직접적으로 사용한적은 없는데 이와 비슷한 기능을 하는 것을 타 언어에서 써본적이 있습니다.

지금 당장은 필요없으신분이 99.9%겠지만 함수 포인터가 필요할 정도로 언어를 배웠다면 그때 찾아보셔도 금방 습득이 가능합니다.

그래도 알고싶다면 아래 링크를 참고하세요.

 

함수포인터를 사용하는 근본적인 이유가 무엇이라고 생각하시나요? | KLDP

굳이 함수포인터를 사용할 필요가 있는건지 궁금합니다. 초기 언어 개발 시에 함수포인터라는 개념을 왜 사용하게 되었는지 궁금하네용

kldp.org

void 포인터

형 정보가 존재하지 않은 포인터 변수이기에 타입에 상관없이 어떠한 주소 값도 저장이 가능합니다.
포인터는 주소값 + 타입이 있어야 하고,일치하여야 합니다.
형 정보가 없기 때문에 *연산자로 역 참조는 불가능합니다.

#include <stdio.h>
int main(void) {
       double d = 3.14;
       int i = 10;
       void * ptr = &d;
       ptr = &d;
       *ptr = 10; //에러 발생
}

댓글