일반적으로말하는 변수포인터의 개념을 어느정도 파악했다면, 함수포인터 또한 같은 맥락으로 이해하면 어렵지 않다.
2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1)
함수명은 함수의 시작번지를 나타내는 포인터역할을 한다.
여기서 func는 포인터인 것이다.
우리는 func라는 함수명과 동등한 포인터를 선언을 할 것이고 그것이 pf 이다.
*구두점을 통해 pf라는 포인터 변수를 선언하였고, pf의 타입은 위 선언처럼 반환값이 int이고, 두개의 int인수를
가지는 함수타입이 된다.
느낌이오면 함수포인터의 선언도 일반적이 변수포인터의 선언과 다르지 않다는걸 알 수 있다.
타입을 명시하고 포인터 선언을 한 것이다. 이중포인터를 선언하고싶다면 구두점**를 붙이면되고,
배열을 선언하고싶다면 *pf[]를 선언하면 된다.
기존의 포인터 선언보다는 복잡하다. 때문에 포인터 변수를 여러개 선언할 시 문제점이 생기게된다.
이럴경우 typedef 을 사용하는법을 알아보자.
typedef int(*PFTYPE)(int,int);
붉은 v표시처럼 쓰면된다.
포인터변수자리에 타입명으로 쓸이름을 적어주면된다.
그리고 그다음처럼 선언을 하면된다.
타입선언을 하게되면 편리한 특성이 또 생기게되는게
타입캐스팅의 경우이다.
반환값과 인수의 타입이 정해져있는데 무슨말이냐 하겠지만,
void타입을 반환하는경우 타입캐스팅을 통해서 대입이 가능하기때문이다. 물론 함부로쓰면안되겠지만, 선언자체가 복잡하다보니 타입캐스팅을 할 때 typedef을 사용하지않고 그냥 한다면 무척 복잡해지기때문이다.
좀 더 직관적인 프로그래밍을 하기위한 방법이다.
그럼 다음엔 함수 포인터를 왜 사용하는지에대해서 알아보기로하겠다.
추가 : 함수포인터를 사용하는 방법 추가
그리 중요한 것은 아니지만 위와 같이 사용할 수도 있다. 설명하자면 기존방법은 함수포인터 타입을 정의한 것이고 이 방법은 비포인터 타입을 정의한 것이다. 선언시 *을 안 붙였기 때문에 함수포인터 생성시 *을 붙여서 생성하면 기존과 같이 사용할 수 있다.