C

void 포인터

1space 2025. 6. 14. 03:04

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 *를 쓰고 형변환해서 사용하는 경우가 많습니다.

 

'C' 카테고리의 다른 글

배열 vs 포인터 : 문자열처리  (0) 2025.06.14
문자열 상수  (0) 2025.06.14
포인터 상수  (0) 2025.06.14
2차원 배열  (0) 2025.06.14
포인터 배열  (0) 2025.06.13