본문 바로가기
개념/혼자 공부하는 C언어

chapter 15) void 포인터 사용

by kiseno 2024. 9. 16.
728x90
반응형
SMALL
#include <stdio.h>

int main(void){
    int a = 10;
    double b = 3.5;
    void *vp;

    vp = &a;
    printf("a : %d\n", *(int *)vp);

    vp = &b;
    printf("b ; %.1lf\n", *(double *)vp);

    return 0;
}

이 코드는 `void` 포인터의 사용법을 설명하는 예제입니다. `void` 포인터는 특정 타입이 정해지지 않은 포인터로, 어떠한 타입의 주소도 저장할 수 있습니다. 이 코드에서는 `void` 포인터를 사용하여 정수형 변수 `a`와 실수형 변수 `b`의 주소를 순차적으로 저장하고, 이를 다시 역참조하여 값을 출력합니다.

### 코드 설명

- `int a = 10;`와 `double b = 3.5;`를 통해 정수형 변수 `a`와 실수형 변수 `b`를 선언하고 각각 10과 3.5로 초기화합니다.
- `void *vp;`는 타입이 정해지지 않은 `void` 포인터 `vp`를 선언합니다.
- `vp = &a;`는 `vp`에 `a`의 주소를 할당합니다. `void` 포인터는 어떤 타입의 주소든 저장할 수 있기 때문에, `int` 타입인 `a`의 주소를 저장하는 데 문제가 없습니다.
- `printf("a : %d\n", *(int *)vp);`에서는 `vp`를 `int *` 타입으로 명시적으로 형 변환하고 역참조하여 `a`의 값을 출력합니다. 이 과정에서 `void` 포인터를 `int` 포인터로 변환해야 `a`의 실제 값에 접근할 수 있습니다.
- `vp = &b;`에서는 `vp`에 `b`의 주소를 할당합니다. 이 때도 `void` 포인터의 범용성 덕분에 `double` 타입인 `b`의 주소를 저장할 수 있습니다.
- `printf("b : %.1lf\n", *(double *)vp);`에서는 `vp`를 `double *` 타입으로 명시적으로 형 변환하고 역참조하여 `b`의 값을 출력합니다. `void` 포인터를 `double` 포인터로 변환함으로써 `b`의 실제 값에 접근합니다.

### 결과

이 프로그램은 두 변수 `a`와 `b`의 값을 성공적으로 출력합니다:

```
a : 10
b : 3.5
```

728x90
반응형
LIST