본문 바로가기
컴퓨터 공학/C, C++

[ C ] 포인터 이해하기7_함수 포인터란? 함수를 포인터에 저장할 수 있을까?

by hahehohoo 2020. 7. 20.
반응형

 

함수 포인터란? 함수 포인터 선언 방법

 

 

 

■ 함수 포인터 개념

 

어셈블리어에서 어떤 함수를 호출하면 사실상 그 함수의 주소로 이동합니다. 

함수의 주소는 컴파일 중 이미 정해지므로, 호출 시 실행됩니다.

물론 함수에서 반환할 때 돌아가야 하는 '호출자' 처럼 실행 중에도 바뀌는 코드도 있습니다. 

 

 

함수 호출하는 어셈블리어 코드 

 

그럼 이제까지 함수를 어떻게 호출했나요? 그렇죠. 함수의 이름을 사용했습니다.

배열의 이름이 배열의 시작주소 값을 의미하듯. 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미합니다. 

이러한 함수의 주소 값을 저장하는 포인터 변수를 '함수 포인터'라고 합니다. 

 

 

 

 

 

 


 

 

■ 함수 포인터 선언

그럼 함수 포인터 선언은 어떻게 해야할까요? 

operator라는 함수를 cal라는 함수의 매개변수로 사용한다고 할 때 다음과 같은 코드를 예상할 수 있습니다. 

1. result = cal(opt1, opt2, operator);

2. result = cal(opt1, opt2, &operator);

 

물론 둘 다 가능하지만, 보통 1번으로 작성합니다. 

그런데 어떤 식이든 간에 operator 함수가 무사히 실행되려면 operator함수의 매개변수 역시 스택에 들어가 있어야 합니다. 하지만 위 코드만으로는 operator함수의 반환값이 뭔지, 매개변수 무슨 형으로 몇 개가 필요한지 알 수가 없습니다. 

 

따라서 함수 포인터 형은 반환형과 매개변수 목록이 결정되어야합니다. 

예로 함수 포인터 변수를 하나 선언하겠습니다. 

1    2       3

int (*fptr) (int)

 

위치 2

fptr은 변수의 이름이고

앞의 *를 통해 포인터 변수라는 것을 알 수 있습니다. 

 

위치 3 

매개변수는 int형으로 하나만 받습니다. 

 

위치 1

반환형은 int형 입니다. 

 

즉, fptr 변수는 int형 매개변수 1개 가지는 int형 함수의 포인터입니다. 

 

이제 int Simple(int num1, int num2) {...} 라는 함수의 주소값을 저장하려면 다음과 같이 대입 연산을 진행하면 됩니다. 

fptr = Simple;

 


 

함수 포인터를 쉽게 읽는 법과 관련하여 부가적인 설명은 다음 글에서 다루겠습니다. 

 

반응형


댓글