[C++] 9. 함수 포인터

2011. 6. 2. 22:11C++


함수 포인터

1. 함수포인터란
함수포인터란 함수의 시작주소를 저장하는 포인터를 말합니다.
컴파일후 실행하면 프로그램 코드들이 메인메모리에 올라갑니다. Stack에 올라가죠.
이때 함수의 이름은 곧 메모리에 존재하는 함수의 위치를 가리키는 주소를 말합니다.

즉, 함수의 이름 ==함수의 위치를 가리키는 포인터

- 일반 포인터는 변수의 주소를 저장하고 있을뿐이지만, 함수 포인터는 리턴타임, 인수목록까지 선언 해야 한다.
- 함수의 원형이 서로 다르면 대입할 수 없다.

예> 리턴타입 (*이름)(인자들..)

예1) int example(int s)  => int (*fp_example)(int)
      void example(void) => void (*fp_example)(void)

예2)
int example(int s){
  return s;
}

int main()
{
  int s;
  int (*fp_example)(int);
  fp_example = example;
  s = (*fp_example)(10);
  std::cout<<s<<std::endl;  // 결과는 10이 나올것이다.
}



2. 함수 포인터 배열
  함수 포인터 배열은 아래와 같이 생성하여 접근할수 있다.
  int (*fp_example[3])(int) = { sum, product, diff };
  사용 => fp_example[1](10);


3. 멤버함수 포인터
c 스타일의 일반함수 포인터와 c++ 클래스에서 사용하는 멤버함수 포인터에는 차이가 있습니다.
static으로 선언된 함수는 일반함수 포인터 형식으로 사용 가능하다.

예3) c++ 스타일의 멤버함수 포인터
  int example(int s) => int (Example::*fp_example)(int) = &Example::example
  사용 => this->*fp_example(4)
  사용 => (test.*functionPointer)(10);   //test 객체를 통해 접근할경우

예4> 함수에 대한 포인터 배열

 

4. Void형 포인터
 어떠한 것도 담을수 있는 바구니 이다. 변수,함수,포인터의 주소값까지 다 담을 수 있습니다.  하지만 아무것도 조작

할수는 없습니다. 단순히, 주소값만 가지고 있을뿐입니다.