프로그래밍/cpp

함수포인터(1)

콘파냐 2014. 1. 2. 14:26

일반적으로말하는 변수포인터의 개념을 어느정도 파악했다면, 함수포인터 또한 같은 맥락으로 이해하면 어렵지 않다.

 

2013/11/28 - [프로그래밍/C언어] - C언어 포인터에 대한 이해(1)

 

함수명은 함수의 시작번지를 나타내는 포인터역할을 한다.

여기서 func는 포인터인 것이다.

우리는 func라는 함수명과 동등한 포인터를 선언을 할 것이고 그것이 pf 이다.

*구두점을 통해 pf라는 포인터 변수를 선언하였고, pf의 타입은 위 선언처럼 반환값이 int이고, 두개의 int인수를

가지는 함수타입이 된다.

느낌이오면 함수포인터의 선언도 일반적이 변수포인터의 선언과 다르지 않다는걸 알 수 있다.

타입을 명시하고 포인터 선언을 한 것이다. 이중포인터를 선언하고싶다면 구두점**를 붙이면되고,

배열을 선언하고싶다면 *pf[]를 선언하면 된다.

 

기존의 포인터 선언보다는 복잡하다. 때문에 포인터 변수를 여러개 선언할 시 문제점이 생기게된다.

이럴경우 typedef 을 사용하는법을 알아보자.

 

typedef int(*PFTYPE)(int,int);

 

붉은 v표시처럼 쓰면된다.

포인터변수자리에 타입명으로 쓸이름을 적어주면된다.

그리고 그다음처럼 선언을 하면된다.

타입선언을 하게되면 편리한 특성이 또 생기게되는게

타입캐스팅의 경우이다.

반환값과 인수의 타입이 정해져있는데 무슨말이냐 하겠지만,

void타입을 반환하는경우 타입캐스팅을 통해서 대입이 가능하기때문이다. 물론 함부로쓰면안되겠지만, 선언자체가 복잡하다보니 타입캐스팅을 할 때 typedef을 사용하지않고 그냥 한다면 무척 복잡해지기때문이다.

좀 더 직관적인 프로그래밍을 하기위한 방법이다.

그럼 다음엔 함수 포인터를 왜 사용하는지에대해서 알아보기로하겠다.


추가 : 함수포인터를 사용하는 방법 추가



그리 중요한 것은 아니지만 위와 같이 사용할 수도 있다. 설명하자면 기존방법은 함수포인터 타입을 정의한 것이고 이 방법은 비포인터 타입을 정의한 것이다. 선언시 *을 안 붙였기 때문에 함수포인터 생성시 *을 붙여서 생성하면 기존과 같이 사용할 수 있다. 


반응형