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

C 언어 void 포인터 완벽 가이드: 개념, 특징, 활용 예제

C 언어에서 void 포인터(void pointer)는 특정 데이터 타입과 연결되지 않은 포인터를 의미합니다. 메모리상의 데이터 위치, 즉 변수의 주소를 가리키며, 타입에 구애받지 않고 다양한 자료형을 담을 수 있어 범용 포인터(general purpose pointer)라고도 불립니다.

대표적으로 C 표준 라이브러리의 malloc()calloc() 함수는 동적 메모리 할당 시 void * 형태의 제네릭 포인터를 반환합니다. 이 덕분에 호출자는 반환된 포인터를 원하는 자료형으로 캐스팅하여 사용할 수 있습니다.

void 포인터의 제한 사항

void 포인터는 유연하지만 다음과 같은 제약이 있습니다.

1) 포인터 연산 불가 — void 포인터는 가리키는 대상의 크기(size)가 확정되지 않기 때문에 증감 연산 등의 포인터 산술 연산을 수행할 수 없습니다.

2) 직접 역참조(dereference) 불가 — 데이터 타입 정보가 없으므로 바로 값을 읽을 수 없으며, 반드시 적절한 자료형으로 캐스팅한 후 역참조해야 합니다.

동작 원리(알고리즘)

시작
    정수형 변수 a 선언
        a = 7로 초기화
    실수형 변수 b 선언
        b = 7.6으로 초기화
    void형 포인터 p 선언
    p를 변수 a의 주소로 설정
    "Integer variable is" 출력
        포인터 p를 이용해 a의 값 출력
    p를 변수 b의 주소로 설정
    "Float variable is" 출력
        포인터 p를 이용해 b의 값 출력
종료

예제 코드

아래는 하나의 void 포인터를 재활용하여 서로 다른 자료형의 값을 출력하는 간단한 예제입니다.

#include<stdlib.h>
int main() {
   int a = 7;
   float b = 7.6;
   void *p;
   p = &a;
   printf("Integer variable is = %d", *( (int*) p) );
   p = &b;
   printf("\nFloat variable is = %f", *( (float*) p) );
   return 0;
}

코드를 살펴보면, 포인터 p는 먼저 정수형 변수 a의 주소를 받았다가, 이후 실수형 변수 b의 주소로 다시 설정됩니다. 출력 시에는 각각 (int*), (float*)로 명시적 캐스팅을 수행한 뒤 역참조하여 올바른 값을 가져옵니다.

실행 결과

Integer variable is = 7
Float variable is = 7.600000

이처럼 void 포인터는 어떤 자료형의 주소든 저장할 수 있는 강력한 도구이지만, 사용 시점에 반드시 적절한 타입으로 변환해야 한다는 점을 기억해야 합니다. 잘못된 타입으로 캐스팅하면 예기치 않은 결과나 오류가 발생할 수 있으므로 주의가 필요합니다.