포인터(pointer)

void 포인터란?

ShadowEye 2021. 6. 21. 14:11

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형을 이용한다면

다른 자료형을 한 자료구조에도 넣을수있지않을까? 라는 생각을해본다.

다른클래스지만 비슷한유형 혹은 같은 부모를 공유하는 클래스들을

 

같은 자료구조에 넣었다 빼는데 쓰면 좋을거같은데 좀더 공부해봐야 겠다.