함수 : 프로그램(exe 파일)이 실행될 때, 우리가 소스파일에 정의한 모든 함수가 메인 메모리(프로그램이 실행되면서 할당받은 메모리)에 올라간다. 이때. 우리가 작성한 함수이름은 함수의 시작 주소를 가리키는 포인터가 되는데, 이 포인터가 가리키는 주소가 변경되면 안되니까.. 포인터 상수로 함수의 시작 주소를 가리키게 된다. 이것을 함수 포인터 라고 부른다.
포인터 상수 : const ptr 포인터를 상수로 처리했다 는 의미이다.---> "포인터를 상수로" 라고 생각하면 쉽다.
cf. 상수 포인터 : ptr 상수를 가리키는 포인터 라는 의미이다. ---> "상수를 가리키는 포인터" 라고 생각하면 쉽다.
① 함수 포인터 선언 문법
void(*FuncPtrName)(int, int) ---> 반환값과 매개변수 타입이 동일한 함수만 호출 가능
FuncPtrName : 함수 포인터의 이름
문법상 괄호와 포인터 표기는 필수!
- 괄호 : 예를 들어, int (*FuncPtrName) ( ); 에서.. 괄호는 제거하게 되면 int* FuncPtrName( ); 이렇게 된다. 이것은 int형 포인터를 반환하는 함수 의 전방선언으로 해석되기 때문에, 함수 포인터를 선언할 때는 문법상 괄호는 꼭 넣어줘야 한다.
- 포인터 : 함수 포인터도 포인터니까.. 포인터 변수 선언하듯 이름 앞에 붙여준다.
② 상수 함수 포인터 선언 문법
상수 함수 포인터 : 함수 포인터가 가리키는 주소를 변경할 수 없도록 상수화 처리한 것
void (*const FuncPtrName)(int, int);
포인터 뒤에 const 를 붙인다. 이 함수 포인터는 초기화 외에는 주소값 변경이 불가능하다.
함수 포인터 사용 ① : 기본
double Add( double left, double right ) { return left + right ; }
void main( ) { // double (*FuncPtrCalc)(double, double) ---> 자체가 변수 선언이다. // 변수 이름은 함수 포인터가 된다. double (*FuncPtrCalc)(double, double) = NULL; FuncPtrCalc = Add;