범용 포인터 사용하기

  • 6 minutes to read

범용 포인터라 불리는 void*에 대해 알아보겠습니다. void라는 단어 자체가 "비어 있는"이라는 뜻을 가지므로, 어떤 타입으로든 변환될 수 있는 포인터를 말합니다.

그림: void 이해하기*

위 그림은 void*와 다른 타입의 포인터 사이의 변환을 나타내는 양방향 화살표입니다. 이것은 상호 변환이 가능하다는 의미입니다.

malloc 함수는 메모리를 할당한 후 그 메모리의 주소를 반환하며, 이 때 반환하는 주소의 타입이 바로 void*입니다. 그렇기 때문에 void* 개념은 메모리 할당에 있어 중요한 역할을 합니다.

예를 들어, 다음 코드는 10개의 int를 저장할 수 있는 메모리를 할당합니다.

int *ptr = malloc(sizeof(int) * 10);

이렇게 할당한 후 반환된 메모리는 void*로, int*로 변환됩니다. 이것이 바로 C 언어 표준에서 권장하는 사용 방법입니다. 하지만 C++에서는 다음과 같이 형변환을 명시적으로 해주어야 합니다.

int *ptr = (int*)malloc(sizeof(int) * 10);

그러나 이 방법은 C 언어에서 사용하면 안 됩니다.

다른 중요한 점은 void*는 역참조할 수 없다는 것입니다. 즉, void*에 저장된 메모리 주소를 통해 직접 데이터를 참조할 수 없습니다.

범용 포인터 선언 및 사용

void*를 사용하는 간단한 예제를 보겠습니다.

코드: void_pointer.c

#include <stdio.h>

int main(void)
{
    int x = 10;
    float y = 20.5;
    char c = 'A';

    // 범용 포인터인 void* 타입의 ptr을 선언합니다.
    // 이 ptr은 어떤 타입의 변수의 주소라도 저장할 수 있습니다.
    void* ptr;

    // ptr에 int 타입 변수 x의 주소를 저장합니다.
    ptr = &x;
    // ptr이 가리키는 주소의 값을 int 타입으로 간주하고 역참조하여 출력합니다.
    printf("ptr이 가리키는 정수 값: %d\n", *(int*)ptr);

    // ptr에 float 타입 변수 y의 주소를 저장합니다.
    ptr = &y;
    // ptr이 가리키는 주소의 값을 float 타입으로 간주하고 역참조하여 출력합니다.
    printf("ptr이 가리키는 실수 값: %.1f\n", *(float*)ptr);

    // ptr에 char 타입 변수 c의 주소를 저장합니다.
    ptr = &c;
    // ptr이 가리키는 주소의 값을 char 타입으로 간주하고 역참조하여 출력합니다.
    printf("ptr이 가리키는 문자 값: %c\n", *(char*)ptr);

    return 0;
}

위 코드의 실행 결과는 다음과 같습니다.

ptr이 가리키는 정수 값: 10
ptr이 가리키는 실수 값: 20.5
ptr이 가리키는 문자 값: A

이 예제에서는 int, float, char 타입의 변수 x, y, c를 선언하고, 범용 포인터 ptr을 선언합니다. 그리고 각 변수의 주소를 ptr에 할당한 후, ptr이 가리키는 값을 출력합니다. 출력할 때는 각 변수의 타입에 맞게 형 변환 연산자를 사용하여 해당 타입으로 변환한 후 출력합니다. 이렇게 void*는 여러 다른 타입의 데이터를 가리킬 수 있어 매우 유연한 용도로 사용될 수 있습니다.

C 언어에서 void 포인터 변환을 활용하는 방법

프로그래밍에서 포인터는 메모리 주소를 저장하는 데 사용되며, C 언어에서는 다양한 유형의 포인터를 활용할 수 있습니다. 그 중 void 포인터는 특별히 유용한데, 그 이유는 임의의 데이터 타입을 가리킬 수 있기 때문입니다. 이번 아티클에서는 C 언어에서 void 포인터를 어떻게 사용하고 형 변환하는지 간단한 예제를 통해 살펴보겠습니다.

코드: void_pointer_example.c

#include <stdio.h>

int main(void)
{
    int x = 5;
    char y = 'A';

    // void 포인터 생성
    void* ptr;

    // int 데이터를 가리키도록 void 포인터 설정
    ptr = &x;

    // void 포인터를 int 포인터로 형변환 후 데이터 출력
    printf("정수 값: %d\n", *((int*)ptr));

    // char 데이터를 가리키도록 void 포인터 설정
    ptr = &y;

    // void 포인터를 char 포인터로 형변환 후 데이터 출력
    printf("문자 값: %c\n", *((char*)ptr));

    return 0;
}
정수 값: 5
문자 값: A

위 예제에서는 void 포인터를 사용하여 intchar 타입의 데이터에 접근하는 방법을 보여줍니다. 먼저, intchar 타입의 변수를 선언하고, void 포인터를 생성합니다.

void 포인터는 int 변수의 주소를 가리키도록 설정되며, 이후에는 해당 포인터를 int 포인터로 형변환하여 값을 출력합니다. 비슷한 방법으로, void 포인터를 char 변수의 주소로 설정한 후, char 포인터로 형변환하여 값을 출력합니다.

이와 같이 void 포인터는 다양한 타입의 데이터를 가리키는 데 사용할 수 있으며, 실제 데이터에 접근하기 전에 적절한 타입으로 형변환하는 것이 중요합니다. 이를 통해 코드의 유연성을 높일 수 있으며, 다양한 데이터 타입을 처리하는 함수나 라이브러리를 작성하는 데 도움이 됩니다.

더 깊이 공부하고 싶다면
DevLec에서는 실무 중심의 C#, .NET, ASP.NET Core, Blazor, 데이터 액세스 강좌를 단계별로 제공합니다. 현재 수강 가능한 강좌 외에도 더 많은 과정이 준비되어 있습니다.
DevLec.com에서 자세한 커리큘럼을 확인해 보세요.
DevLec 공식 강의
C# Programming
C# 프로그래밍 입문
프로그래밍을 처음 시작하는 입문자를 위한 C# 기본기 완성 과정입니다.
ASP.NET Core 10.0
ASP.NET Core 10.0 시작하기 MVC Fundamentals Part 1 MVC Fundamentals Part 2
웹 애플리케이션의 구조와 MVC 패턴을 ASP.NET Core로 실습하며 익힐 수 있습니다.
Blazor Server
풀스택 웹개발자 과정 Part 1 풀스택 웹개발자 과정 Part 2 풀스택 웹개발자 과정 Part 3
실무에서 바로 활용 가능한 Blazor Server 기반 관리자·포털 프로젝트를 만들어 봅니다.
Data & APIs
Entity Framework Core 시작하기 ADO.NET Fundamentals Blazor Server Fundamentals Minimal APIs
데이터 액세스와 Web API를 함께 이해하면 실무 .NET 백엔드 개발에 큰 도움이 됩니다.
VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com