함수 포인터

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

 

함수 포인터의 특징

  • 함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다(함수 포인터).
  • 함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장할 수 있다.
  • 함수 포인터 변수를 선언할려면 함수 포인터의 형(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; //에러 발생
}

'프로그래밍 > C' 카테고리의 다른 글

C언어 함수 포인터와 void 포인터  (0) 2019.04.18
포인터의 포인터(이중 포인터)에 대한 이해  (0) 2019.04.18
C언어 다차원 배열  (0) 2019.04.18
상수 형태의 문자열을 가리키는 포인터  (0) 2019.04.17
포인터 연산  (0) 2019.04.17
C언어 포인터  (0) 2019.04.17

댓글을 달아 주세요