본문 바로가기

C++/Pointer

C++ Pointers

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 = &num;

	// 모든 형의 주소를 다 받을 수 있는 포인터 변수. 값을 구할 때는 반드시 형변환이 필요하다
	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;
}