게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
포인터를 이중포인터로 잠시 바꿔 사용한다?? 이게 뭔 뜻인지....
게시물ID : programmer_11983짧은주소 복사하기
작성자 : 우와우와우왕
추천 : 0
조회수 : 955회
댓글수 : 5개
등록시간 : 2015/07/09 16:21:25
void *는 원래 임의의 타입을 모두 가리킬 수 있는 타입이다.
이 임의의 타입에는 포인터 타입도 당연히 포함되며 포인터 변수도 분명히 변수이므로 번지가 있고 이 번지를 void *의 변수가 가질 수 있는 것이다.
void *vp가 int *pi를 가리키고 있을 때 대상체를 읽고 싶다면 캐스트 연산자를 적절히 잘 사용해야 한다.
**(int **)vp 이렇게 되는데 vp를 int형 이중 포인터로 잠시 바꾼 후 *를 두 번 적용하면 pi가 가리키는 정수를 읽을 수 있다.
 
 
 --------------------------------------------------------------------------
 
 
재가 공부하는 사이트에서 이중void포인터에 대해서 설명하는 부분의 일부인데요
 
3번째줄을 보면
 
void *의 자료형 변수vp가 int * 자료형 변수vi를 가리킬때    vi가 가리키는 값을 vp를 통해서 얻고 싶으면
 
**(int **)vp
 
이렇게 해서 값을 얻어라고 되어 있습니다.
 
설명도 보면 그럴싸 하구요
 
vp가 가리키는 값이 가리키는 값을 얻기위해 **를 두번 적용한다.
 
그래서 재가 실습해보니
 
Code Snippet
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.     void *vp;
  7.     int *ip=NULL;
  8.     vp = ip;
  9. // vp = &ip;
  10.  
  11.     vp = malloc(sizeof(int));
  12.     *(int*)vp = 5;
  13. // **(int**)vp = 5;
  14.     printf(" %d \n",  **(int**)vp);// *(int*)vp는 정상출력 된다.
  15.     return 0;
  16. }
 
 
 
 
대충 이런형태가 되는듯한데 컴파일하면 자꾸 15째 줄에서 에러가 납니다...
 
혹시나 vp가 한번에 ip가 가리키는 값을 포인트 하는게 아니라 ip의 주소를 포인트 하면 결과가 달라질까 싶어서
 
주석부분으로 바꾸어 컴파일해도 마찬가지네요...
 
 
 
그런데  **(int**)vp 이녀석을 *(int*)vp이렇게 바꾸면
 
ip가 가리키는 값인 5가 정상적으로 출력되구요
 
 
재가 작성한 코드가 틀린건가요?? 아니면 설명이 틀린건가요??
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호