void pointer

Jaemyeong Lee·2024년 8월 7일
0

FastCampusC++

목록 보기
35/78

C++ void 포인터 사용법

void 포인터는 어떤 데이터 타입도 가리킬 수 있는 포인터로, C++에서 매우 유용하게 사용됩니다. void 포인터는 특정 데이터 타입을 가리키지 않기 때문에 형변환을 통해 원하는 타입으로 변환해야 합니다. 이번 포스트에서는 void 포인터의 사용법과 예제를 살펴보겠습니다.

#include <iostream>

using namespace std;

int main()
{
    // 첫 번째 블록: `void` 타입 변수 선언 불가
    {
        // `void` 타입 변수는 선언할 수 없습니다.
        // void p; // 컴파일 오류 발생
    }
    
    // 두 번째 블록: `void` 포인터의 기본 사용법
    {
        int num = 10; // 정수형 변수 선언 및 초기화
        int* p = &num; // 정수형 포인터 p에 num의 주소값 저장

        // `void` 포인터는 어떤 데이터형도 가리킬 수 있습니다.
        void* vp = p; // 정수형 포인터 p를 `void` 포인터 vp로 변환

        // `void` 포인터는 데이터형을 알 수 없기 때문에 직접적으로 역참조할 수 없습니다.
        // cout << *vp << endl; // 컴파일 오류 발생
        
        // `void` 포인터를 원래의 데이터형으로 변환하여 사용해야 합니다.
        p = (int*)vp; // `void` 포인터 vp를 정수형 포인터 p로 변환
    }
    
    // 세 번째 블록: `void` 포인터와 배열
    {
        int nums[] = { 1, 2, 3 }; // 정수형 배열 선언 및 초기화
        void* vp = nums; // 배열의 첫 번째 요소를 `void` 포인터로 변환

        // `void` 포인터는 직접적으로 배열 요소에 접근할 수 없습니다.
        // cout << *(vp + 1) << endl; // 컴파일 오류 발생
    }
    
    // 네 번째 블록: 동적 메모리 할당에서의 `void` 포인터 사용
    {
        // `malloc` 함수는 지정된 크기의 메모리를 동적 할당하며, `void*` 타입으로 반환합니다.
        // 이 예제에서는 정수형 3개의 크기만큼 메모리를 할당합니다.
        int* p = (int*)malloc(sizeof(int) * 3); // 동적 메모리 할당 및 `void` 포인터를 정수형 포인터로 변환

        // 동적 할당된 메모리는 반드시 해제해야 합니다.
        // `free` 함수는 모든 타입의 동적 할당된 메모리를 해제할 수 있습니다.
        free(p); // 메모리 해제
    }

    return 0;
}

1. void 타입 변수 선언 불가

첫 번째 블록에서는 void 타입 변수를 선언할 수 없음을 보여줍니다.

{
    // `void` 타입 변수는 선언할 수 없습니다.
    // void p; // 컴파일 오류 발생
}
  • void는 데이터 타입이 없음을 의미하므로 변수로 선언할 수 없습니다.

2. void 포인터의 기본 사용법

두 번째 블록에서는 void 포인터의 기본 사용법을 설명합니다.

{
    int num = 10; // 정수형 변수 선언 및 초기화
    int* p = &num; // 정수형 포인터 p에 num의 주소값 저장

    // `void` 포인터는 어떤 데이터형도 가리킬 수 있습니다.
    void* vp = p; // 정수형 포인터 p를 `void` 포인터 vp로 변환

    // `void` 포인터는 데이터형을 알 수 없기 때문에 직접적으로 역참조할 수 없습니다.
    // cout << *vp << endl; // 컴파일 오류 발생
    
    // `void` 포인터를 원래의 데이터형으로 변환하여 사용해야 합니다.
    p = (int*)vp; // `void` 포인터 vp를 정수형 포인터 p로 변환
}
  • void 포인터는 어떤 데이터 타입도 가리킬 수 있습니다.
  • 하지만 void 포인터는 직접적으로 역참조할 수 없으므로, 원래의 데이터 타입으로 형변환해야 합니다.

3. void 포인터와 배열

세 번째 블록에서는 void 포인터와 배열의 관계를 다룹니다.

{
    int nums[] = { 1, 2, 3 }; // 정수형 배열 선언 및 초기화
    void* vp = nums; // 배열의 첫 번째 요소를 `void` 포인터로 변환

    // `void` 포인터는 직접적으로 배열 요소에 접근할 수 없습니다.
    // cout << *(vp + 1) << endl; // 컴파일 오류 발생
}
  • void 포인터는 배열의 첫 번째 요소를 가리킬 수 있지만, 직접적으로 배열 요소에 접근할 수 없습니다.
  • 배열 요소에 접근하려면 적절한 타입으로 변환해야 합니다.

4. 동적 메모리 할당에서의 void 포인터 사용

네 번째 블록에서는 동적 메모리 할당에서 void 포인터의 사용법을 설명합니다.

{
    // `malloc` 함수는 지정된 크기의 메모리를 동적 할당하며, `void*` 타입으로 반환합니다.
    // 이 예제에서는 정수형 3개의 크기만큼 메모리를 할당합니다.
    int* p = (int*)malloc(sizeof(int) * 3); // 동적 메모리 할당 및 `void` 포인터를 정수형 포인터로 변환

    // 동적 할당된 메모리는 반드시 해제해야 합니다.
    // `free` 함수는 모든 타입의 동적 할당된 메모리를 해제할 수 있습니다.
    free(p); // 메모리 해제
}
  • malloc 함수는 지정된 크기의 메모리를 할당하고, 이를 void 포인터로 반환합니다.
  • 할당된 메모리는 free 함수를 사용하여 해제해야 하며, free 함수는 void 포인터를 매개변수로 받습니다.
profile
李家네_공부방

0개의 댓글