정의

MSDN에서 void에 정의는 다음과 같다

함수 반환 형식으로 사용 하는 경우 void 키워드는 함수가 값을 반환 하지 않도록 지정 합니다. 함수 매개 변수 목록에 사용 되는 경우 void 는 함수가 매개 변수를 사용 하지 않도록 지정 합니다. 포인터 선언에 사용 되는 경우 void 는 포인터가 "universal(만능)" 임을 지정 합니다.

포인터 형식이 void* 이면 포인터는 const 또는 volatile 키워드를 사용 하 여 선언 되지 않은 모든 변수를 가리킬 수 있습니다. Void* 포인터는 다른 형식으로 캐스팅 된 경우에만 역참조 될 수 있습니다. Void* 포인터를 다른 형식의 데이터 포인터로 변환할 수 있습니다.

Void 포인터는 함수를 가리킬 수 있지만의 C++클래스 멤버가 아니어야 합니다.

Void형식의 변수는 선언할 수 없습니다.

void pointer는 제네릭 포인터(generic pointer)라고 불린다.
모든 데이터 자료형을 가리킬 수 있는 포인터이다.

void* 는 다른 변수를 가리킬 수 있지만. 다른 형식으로 캐스팅 된 경우에만 역참조가 된다고 하고
const 또는 volatile 키워드로 사용 하여 선언 되지 않은 모든 변수를 가리킬 수 있다고 한다.
코드를 통해 보자.

#include <iostream>


class VP_TEST_CLASS
{

};

int main()
{
	int _i;
	short _s;
	VP_TEST_CLASS v_t_c;
	void* v_p;

	v_p = &_i;
	std::cout << *v_p << std::endl;
	v_p = &_s;
	std::cout << *v_p << std::endl;
	v_p = &v_t_c;
	std::cout << *v_p << std::endl;

	const int _c_i = 10;
	v_p = &_c_i;

	volatile int _v_i;
	v_p = &_v_i;


	return 0;
}

void* 는 모든 자료형을 가리키고 있지만
출력을 하려고 해도 void* 는 자료형의 객체를 알지 못하기 때문에 역참조가 불가능하다.
역참조를 하려면 void*를 다른 포인터의 유형으로 명시적 형 변환을 해야한다.

또한 const, volatile 형식의 변수는 void* 로 가리킬수 없다.

#include <iostream>


class VP_TEST_CLASS
{

};

int main()
{
	int _i = 20;
	short _s;
	VP_TEST_CLASS v_t_c;
	void* v_p;

	int* _i_p;
	v_p = &_i;
	_i_p = static_cast<int*>(v_p);
	std::cout << *_i_p << std::endl;
	return 0;
}

또한 포인터 산술에서도 void*는 되지않는다 포인터 산술은 포인터가 어떤 크기의 객체를 가리키는지 알아야 하므로 포인터를 더하거나 뺄수없는 void*는 포인터 연산이 되지않는다.

#include <iostream>

int main()
{
	int _i = 20;

	void* v_p;
	int* i_p;

	v_p = &_i;
	i_p = &_i;

	v_p++;
	i_p++;

	return 0;
}

또한 void reference 보이드 참조도 안된다!

#include <iostream>

int main()
{
	int _i = 20;

	void* v_p;
	int* i_p;

	void& r_p = _i;
	int& r_i = _i;

	return 0;
}

'게임 프로그래밍 > C++ 기초' 카테고리의 다른 글

C++ goto (고투)  (2) 2020.05.14
C++ 바이트패딩 Byte Padding (두번째!)  (4) 2020.05.13
C++ 함수 포인터  (0) 2020.05.05
C++ 가변 인자 템플릿  (0) 2020.05.05
C++ 가변인자  (1) 2020.05.03

+ Recent posts