void *는 원래 임의의 타입을 모두 가리킬 수 있는 타입이다.
이 임의의 타입에는 포인터 타입도 당연히 포함되며 포인터 변수도 분명히 변수이므로 번지가 있고 이 번지를 void *의 변수가 가질 수 있는 것이다.
void *vp가 int *pi를 가리키고 있을 때 대상체를 읽고 싶다면 캐스트 연산자를 적절히 잘 사용해야 한다.
**(int **)vp 이렇게 되는데 vp를 int형 이중 포인터로 잠시 바꾼 후 *를 두 번 적용하면 pi가 가리키는 정수를 읽을 수 있다.
--------------------------------------------------------------------------
재가 공부하는 사이트에서 이중void포인터에 대해서 설명하는 부분의 일부인데요
3번째줄을 보면
void *의 자료형 변수vp가 int * 자료형 변수vi를 가리킬때 vi가 가리키는 값을 vp를 통해서 얻고 싶으면
**(int **)vp
이렇게 해서 값을 얻어라고 되어 있습니다.
설명도 보면 그럴싸 하구요
vp가 가리키는 값이 가리키는 값을 얻기위해 **를 두번 적용한다.
그래서 재가 실습해보니
Code Snippet
- #include<stdio.h>
- #include<stdlib.h>
-
- int main(void)
- {
- void *vp;
- int *ip=NULL;
- vp = ip;
- // vp = &ip;
-
- vp = malloc(sizeof(int));
- *(int*)vp = 5;
- // **(int**)vp = 5;
- printf(" %d \n", **(int**)vp);// *(int*)vp는 정상출력 된다.
- return 0;
- }
대충 이런형태가 되는듯한데 컴파일하면 자꾸 15째 줄에서 에러가 납니다...
혹시나 vp가 한번에 ip가 가리키는 값을 포인트 하는게 아니라 ip의 주소를 포인트 하면 결과가 달라질까 싶어서
주석부분으로 바꾸어 컴파일해도 마찬가지네요...
그런데 **(int**)vp 이녀석을 *(int*)vp이렇게 바꾸면
ip가 가리키는 값인 5가 정상적으로 출력되구요
재가 작성한 코드가 틀린건가요?? 아니면 설명이 틀린건가요??