C++ 프로그래밍, 포인터 ( Pointers )
void 포인터
void 포인터란 어떤 자료형의 데이터든지 가리지 않고 변수의 주소라면 무조건 받을 수 있는 포인터 변수의 특별한 자료형이다. 예를 들어, 정수를 가리키는 주소나 실수를 가리키는 주소를 가리지 않고 어떤 포인터 변수에 할당하려면 void 포인터를 사용해야 한다
void * vp;
int i = 7;
double d = 1.2;
vp = &i;
vp = &d;
NULL 포인터
포인터 변수는 어떤 변수의 주소를 가져야 하는데, 포인터 변수가 NULL, 혹은 0 으로 초기화되어 아직 아무런 주소도 저장하고 있지 않은 상태를 말한다.
int * num = NULL;
함수 포인터
특정 함수가 저장된 메모리 상의 주소를 저장한 변수를 함수 포인터라고 한다. 함수 포인터 변수를 선언할 때는 특별한 형식을 따라야 하는데, 함수 원형을 선언할 때 사용하는 모든 것을 사용하여 선언하지만 함수 이름을 사용하지는 않는다. 다음과 같은 형식을 따른다
리턴타입 (*함수포인터변수) (파라미터);
int (*pf)(int,int); // 리턴타입이 int 이고 정수 파라미터 2개를 가진 함수의 주소를 저장할 변수, pf를 선언함
#include <iostream> #include <locale> using namespace std; int add(int a, int b) { return a+b; } // 파라미터에 함수 포인터를 선언한 함수 void action(int a, int b, int (*func)(int,int)) { int res = func(a,b); wcout << L"함수 포인터를 이용한 함수 호출 결과:" << res << endl; } int main() { setlocale(LC_ALL,""); wcout << L"void 포인터, NULL 포인터, 함수 포인터" << endl; int num = 7; int * pNum = NULL; // NULL 포인터, NULL혹은 0으로 초기화된 포인터 pNum = # // 모든 형의 주소를 다 받을 수 있는 포인터 변수. 값을 구할 때는 반드시 형변환이 필요하다 void* vp = pNum; //int* pNum2 = *vp; // error: 'void*' is not a pointer-to-object type // void 포인터는 특정 형을 가진 상태가 아니므로 값을 구할 때는 먼저 형변환이 필요하다 int* pNum2 = (int*) vp; cout << "num2=" << *pNum2 << endl; // 함수의 이름은 해당 함수의 주소를 저장한 포인터이다 action(2,5, add); // 아래처럼 해도 된다 int (*pf)(int,int); // 함수 포인터 변수 선언 pf = add; // 함수 포인터에 함수 주소 할당 action(2,5, pf); // 함수 포인터를 요구하는 다른 함수로 전달 return 0; }