강께르의 개발일지
[C++] void 포인터와 함수형 포인터 본문
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(); // 사용하면 된다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 객체 지향 프로그래밍과 특징 정리 (0) | 2021.06.10 |
---|---|
[C++] enum과 enum class (0) | 2021.06.10 |
[C++] Call by value / address / reference (0) | 2021.06.09 |
[C++] 함수 / 함수 오버로딩 / 디폴트 매개변수 (0) | 2021.06.07 |
[C++] 메모리 영역에 대한 조사 및 정리 (0) | 2021.06.02 |