[C++] void 포인터(void*)

2024. 3. 14. 11:04Programming Language/C++

void

• 함수에 반환 타입이 없을 때 사용

void Func()
{
	int a = 0;
}

void*

포인터가 가리키는 곳의 타입(자료형)이 정해지지 않았을 때 사용한다.

가능 불가능
• 모든 타입의 변수(주소) 저장 • 역참조
• 주소 연산

▶ 가능

void* pVoid = nullptr;

`pVoid`가 가리키는 곳의 타입이 정해지지 않았기 때문에 변수(주소)가 어떤 타입이든 다 저장할 수 있다.

즉, int형이든 double형이든 상관이 없다는 뜻이다.

int main()
{
	// 자료형*
	int* pInt = nullptr;
    char c = 0;
    pInt = &c;  // 오류
    
    // void*
	void* pVoid = nullptr;

	int i = 0;
    float f = 0.f;
    double d = 0.;
    long l = 0;
    long long ll = 0;
    
    pVoid = &i;  // 가능
    pVoid = &f;  // 가능
    pVoid = &d;  // 가능
    pVoid = &l;  // 가능
    pVoid = ≪  // 가능

	return 0;
}

▶ 불가능

1. 역참조가 불가능하다.

역참조 : 주소를 통해 값에 접근하는 것

`자료형*`일 때는 `*포인터변수`로 주소에 접근할 수 있다.

`int*`의 경우 가리키는 곳의 크기가 4byte라는 것을 알기에 역참조를 할 수 있다.

하지만 `void*`는 포인터가 가리키는 곳의 타입이 정해져있지 않아 그 크기가 얼마인지 모르기 때문에 역참조가 불가능하다.

int main()
{
    int* pInt = nullptr;
    *pInt;  // 역참조 가능

	void* pVoid = nullptr;
    //*pVoid;  // 오류 => 역참조 불가능

	return 0;
}

2. 주소 연산이 불가능하다.

`void*`은 타입이 정해져 있지 않아서 '한 단계 증감한다'의 '한 단계'도 정해져 있지 않으므로 주소 연산을 할 수 없다.

int main()
{
	void* pVoid = nullptr;
    //pVoid + 1;  // 오류 => 주쇼 연산 불가능

	return 0;
}