정의
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 |