강께르의 개발일지

[C++] void 포인터와 함수형 포인터 본문

프로그래밍/C++

[C++] void 포인터와 함수형 포인터

강께르 2021. 6. 10. 09:36

1. void 포인터란?

- void 포인터는 const, volatile를 사용하여 선언되지 않은 객체를 포함한 모든 자료형 변수를 가리킬 수 있는 있다.

- 가리키고 있는 변수의 자료형의 크기, 길이를 알아올 수 없을 뿐이다. 시작 주소를 제공 받아 쓸 수 있는 것이다.

- 함수를 가리키는 주소값을 저장하여 함수형 포인터로 사용할 수 있다.

- 다른 이름으로 제네릭 포인터(generic pointer)라고 불린다.

 

2. 사용 시 유의사항

- void 포인터는 자신이 가리키는 변수가 어떤 자료형인지 알지 못하기 때문에 직접 역참조를 할 수 없다.

- 그러므로 void 포인터의 역참조를 수행하기 위해서 가리키고 있는 변수의 자료형으로 형 변환을 해야만 한다.

- void 포인터의 포인터 연산도 역참조와 마찬가지 방법으로 형 변환을 한 뒤에 연산을 하면 된다.

int a = 1, int b = 2;

void* aptr = &a;
void* bptr= &b;

cout << *(int*)aptr;	// O, 역참조 가능
cout << *bptr;	        // X, 역참조 불가능

(int*)aptr + 1;         // 형 변환을 먼저 수행하고 포인터 연산을 수행 
(int*)bptr - 1;

- void reference는 되지 않는다고 한다.

 

3. 함수형 포인터

- 함수의 이름은 함수를 가리키는 주소값이다. 실제 함수를 호출하면 함수의 주소를 이용하여 호출하는 것이다.

- 이 함수의 주소를 저장하여 함수를 가리키는 함수 포인터를 void 포인터로 가능하다.

- 함수의 주소를 가리키는 함수 포인터는 함수를 간접적으로 실행이 가능하다.

void func(void) { }    // 이런 함수가 있다고 한다면...
void (*funcPtr)(void); // void 포인터로 함수 포인터를 만들고
funcPtr = func;        // 주소값을 대입하여
funcPtr();             // 사용하면 된다.

 

더보기