void 포인터란?
void *ptr;
- void *는 “아무 타입의 주소든 저장할 수 있는 포인터”입니다.
- 즉, 형(type)이 없는 포인터입니다.
- int*, char*, float* 다 저장할 수 있습니다.
int a = 10;
float b = 3.14;
char c = 'A';
void *ptr;
ptr = &a; // OK
ptr = &b; // OK
ptr = &c; // OK
결론:
void *는 “만능 포인터”입니다.
→ 어떤 타입의 주소도 받아들일 수 있는 범용 포인터입니다.
왜 이런 게 필요할까?
- 함수에서 여러 타입을 처리할 때 쓰입니다.
- 대표적으로 malloc() 함수는 void *를 반환합니다.
void 포인터의 한계 (단점)
❌ void 포인터는 역참조가 불가능합니다
void *ptr = &a;
*ptr = 20; // ❌ 오류! 타입이 없기 때문에 *ptr은 사용할 수 없음
- void는 "자료형 없음"이기 때문에 *ptr처럼 역참조(dereferencing) 할 수 없습니다.
- 컴파일러가 이게 몇 바이트짜리 값인지 몰라서 역참조를 못 합니다.
해결 방법: 형변환 (type casting)
void *ptr = &a;
*(int *)ptr = 20; // OK! 형변환 후 역참조
printf("%d", *(int *)ptr); // a의 값 출력 가능
- ptr은 그냥 주소만 담고 있음 → *(int *)ptr 처럼 형을 알려줘야 메모리 접근 가능
- (int *)ptr은 “이 주소는 int형을 가리키는 포인터야!”라고 알려주는 것
📌 즉, 역참조할 땐 반드시 형변환 필요
실전에서의 용도와 요약
주요 사용 예: 범용 함수 매개변수
void printValue(void *data, int type) {
if (type == 0) // int
printf("%d\n", *(int *)data);
else if (type == 1) // float
printf("%f\n", *(float *)data);
else if (type == 2) // char
printf("%c\n", *(char *)data);
}
이처럼 한 함수에서 여러 타입을 처리해야 할 때, void *를 쓰고 형변환해서 사용하는 경우가 많습니다.