Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 void 포인터 완벽 정리: 개념부터 선언, 타입 캐스트 활용법까지

void 포인터란 무엇인가?

void 포인터(void pointer)는 모든 자료형의 변수 주소를 저장할 수 있는 포인터입니다. 즉, int, float, char 등 어떤 자료형의 변수든 가리킬 수 있어서 '범용 포인터(generic pointer)'라고도 불립니다.

선언 방법

void 포인터는 다음과 같이 선언합니다.

void *pointername;

예를 들면 다음과 같습니다.

void *vp;

값에 접근하는 방법

void 포인터가 가리키는 변수의 값을 읽으려면 타입 캐스트(type cast) 연산자를 사용해야 합니다. 컴파일러는 void 포인터가 어떤 자료형을 가리키는지 알 수 없기 때문에, 역참조(dereference)하기 전에 반드시 원하는 자료형으로 변환해 주어야 합니다.

기본 문법

void 포인터의 문법은 아래와 같습니다.

* ( (type cast) void pointer)

예제 1: 기본 사용법

int i=10;
void *vp;
vp = &i;
printf ("%d", * ((int*) vp));
// int * 타입 캐스트

다음은 void 포인터의 전체 동작 과정을 보여주는 C 프로그램입니다.

#include<stdio.h>
main ( ){
    int i =10;
    float f = 5.34;
    void *vp;
    vp = &i;
    printf ("i = %d", * ((int*)vp));
    vp = &f;
    printf ( "f = %f", * ((float*) vp));
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

i = 10
f = 5.34

위 예제에서 하나의 void 포인터 vp가 int형 변수 i와 float형 변수 f를 번갈아 가리키며, 각각 올바른 자료형으로 캐스팅하여 값을 정확히 출력하는 것을 확인할 수 있습니다.

예제 2: void 포인터와 포인터 연산

다음은 void 포인터로 포인터 연산(pointer arithmetic)을 수행하는 C 프로그램입니다.

#include<stdio.h>
#define MAX 20
int main(){
    int array[5] = {12, 19, 25, 34, 46}, i;
    void *vp = array;
    for(i = 0; i < 5; i++){
        printf("array[%d] = %d\n", i, *( (int *)vp + i ) );
    }
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

array[0] = 12
array[1] = 19
array[2] = 25
array[3] = 34
array[4] = 46

void 포인터 사용 시 주의사항

  • 직접 역참조 불가: void 포인터에는 자료형 정보가 없으므로 *vp처럼 직접 역참조하면 컴파일 오류가 발생합니다. 반드시 타입 캐스트 후 사용해야 합니다.
  • 포인터 연산 제한: 표준 C(ANSI C)에서는 void 포인터에 대한 산술 연산을 허용하지 않습니다. GNU C 등 일부 확장에서는 char 크기(1바이트) 단위로 계산되므로, 위 예제처럼 (int*)로 캐스팅한 후 연산하는 것이 안전합니다.
  • 주요 활용 분야: 자료형과 무관하게 메모리를 다루는 malloc() 함수의 반환값, qsort() 같은 범용 라이브러리 함수의 매개변수 등에서 널리 사용됩니다.