함수 포인터
함수의 이름은 포인터입니다. 마치 배열의 이름이 포인터인듯이 함수의 이름도 포인터입니다.
이걸 함수 포인터라고 하고 배열의 이름과 마찬가지로 상수 형태입니다.
함수 포인터의 특징
- 함수의 이름은 함수가 저장된 메모리 공간을 가리키는 포인터이다(함수 포인터).
- 함수의 이름이 의미하는 주소 값은 함수 포인터 변수를 선언해서 저장할 수 있다.
- 함수 포인터 변수를 선언할려면 함수 포인터의 형(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%겠지만 함수 포인터가 필요할 정도로 언어를 배웠다면 그때 찾아보셔도 금방 습득이 가능합니다.
그래도 알고싶다면 아래 링크를 참고하세요.
void 포인터
형 정보가 존재하지 않은 포인터 변수이기에 타입에 상관없이 어떠한 주소 값도 저장이 가능합니다.
포인터는 주소값 + 타입이 있어야 하고,일치하여야 합니다.
형 정보가 없기 때문에 *연산자로 역 참조는 불가능합니다.
#include <stdio.h>
int main(void) {
double d = 3.14;
int i = 10;
void * ptr = &d;
ptr = &d;
*ptr = 10; //에러 발생
}
댓글