본문 바로가기
개발/C++

[C++] 함수 포인터 란? 함수 포인터 만들고 사용하기 (function pointer)

by jinhyuk._.c 2022. 10. 28.

 

 

 

1. 함수포인터(function pointer)란?

포인터가 다른 변수의 주소를 저장하는 변수라면 이와 비슷하게 함수 포인터라는 개념이 있습니다.

함수 포인터는 함수를 가리키는 변수 입니다. 즉 함수의 주소를 저장하는 변수 입니다.

 

 

 

 

식별자 func는 함수의 이름입니다. 그러나 함수의 타입은 무엇일까요?

함수는 고유한 l-value 함수 타입입니다. 위의 경우 정수를 반환하고 매개 변수를 받지 않는 함수 타입입니다.

변수와 마찬가지로 함수는 메모리의 할당된 주소에 있습니다.

 

() 연산자를 통해 함수를 호출하면, 호출되는 함수의 주소로 점프하여 실행을 하게됩니다.

 

함수 func를 std::cout 으로 출력하면 주소값이 출력이 됩니다.

 

 

 

 

 

함수에 대한 포인터(pointer to function)

비 상수 함수 포인터(non-const function pointer)를 생성하는 문법은 C++ 에서 볼수있는 문법입니다.

 

 

 

위 코드에서 int (*test)( ); 은 인수가 없고 정수를 반환하는 함수에 대한 포인터입니다.

(즉, 함수 포인터) 그러므로 이 타입과 같은 함수를 가리킬 수 있습니다.

괄호가 필요한 이유는 int* test( ); 로 사용할 경우 코드는 정수에 대한 포인터를 반환하는 인수가 없는 함수.

즉,  test의 전방 선언으로 해석되기 때문에 우선순위를 지키기 위해 사용이 됩니다.

 

 

 

 

2. 함수 포인터에 함수 할당하기

함수 포인터는 함수로 초기화 할 수 있습니다.

 

 

 

 

C++은 기본 자료형과 달리 필요할 경우 함수를 함수 포인터로 암묵적으로 변환하므로 주소 연산자 &를 사용할 필요가 없습니다.

 

 

 

 

3. 함수 포인터를 사용해서 함수 호출하기

함수 포인터로 실체 함수를 호출할 수 있습니다. 

호출하는 방법은 두가지 방법이 있는데,

첫번째는 명시적인 역참조 입니다.

두번째 방법은 암시적인 역참조를 통한 방법입니다.

 

일반적인 함수 이름은 함수의 포인터가 되기 때문에 암시적 추론을 통한 역참조 방법은 일반 함수 호출과 똑같이 생겼습니다. -> 최근 컴파일러는 대부분 이방법을 지원합니다.

반응형

댓글