void 포인터란?
1. void 포인터란 (사전적 의미)?
- void 포인터는 const, volatile를 사용하여 선언되지 않은 객체를 포함한 모든 자료형 변수를 가리킬 수 있는 있다.
- 가리키고 있는 변수의 자료형의 크기, 길이를 알아올 수 없을 뿐이다. 시작 주소를 제공 받아 쓸 수 있는 것이다.
- 함수를 가리키는 주소값을 저장하여 함수형 포인터로 사용할 수 있다.
- 다른 이름으로 제네릭 포인터(generic pointer)라고 불린다.
- void 포인터는 자신이 가리키는 변수가 어떤 자료형인지 알지 못하기 때문에 직접 역참조를 할 수 없다.
- 그러므로 void 포인터의 역참조를 수행하기 위해서 가리키고 있는 변수의 자료형으로 형 변환을 해야만 한다.
- void 포인터의 포인터 연산도 역참조와 마찬가지 방법으로 형 변환을 한 뒤에 연산을 하면 된다.
2. 말로 풀어서 써보기
이걸 말로 풀어서 설명하자면 그동안 사용해왔던 포인터들은 하나같이 자료형이 존재했다.
int* a;
double* d;
class* c;
void는 말그대로 공허를 의미하므로 void* 는 void형 데이터가 있다. 라는 뜻이다.
즉 void* 는 "나는 주소값을 가지고있지만 이 주소값에 존재하는 데이터가 뭔지는 모르지만 아무튼 가지고있어!!"
라는뜻이다.
그렇다면 아래의 코드에서 처럼 void* 를 참조하면 어떻게 될까??
int a = 10;
int* pa = &a;
int A = 10;
void* pA = &A;
cout << *pA << endl;
우리의 똑똑한 컴파일러는 void*의 값을 읽지 못하기 때문에 void*에 있는 변수를 참조하면 오류가 난다고 알려준다.
왜냐하면 알수없는 데이터이기때문에 컴퓨터가 읽지 못하는것이다.
그렇기에 void를 다시 원래의 자료형으로 변환시켜야 이주소값에 존재하는 데이터를 사용할수있는것이다.
int a = 10;
int* pa = &a;
int A = 10;
void* pA = &A;
cout << *(int*)pA << endl;
3. 어디다 써먹어야 할까? (나의생각)
그냥 쓸수도 없고 해당 주소값의 자료형도 모르면 쓸수 없는 void형 포인터를 어디다 쓸수있을까?
만약 해당하는 자료형을 알수있고 해당 주소값은 void형을 이용한다면
다른 자료형을 한 자료구조에도 넣을수있지않을까? 라는 생각을해본다.
다른클래스지만 비슷한유형 혹은 같은 부모를 공유하는 클래스들을
같은 자료구조에 넣었다 빼는데 쓰면 좋을거같은데 좀더 공부해봐야 겠다.