본문 바로가기

Programming/C++

09. void 더블 포인터

void**라는 타입이 void *타입을 가리키는 유도 타입이므로 void ** vpp; 변수를 선언할 때 vpp의 대상체는 임의의 대상체를 가리키는 void *타입이다

void* 와는 달리 void** 가리키는 대상체의 타입이 void * 분명히 정해져 있고 대상체의 크기(포인터4bit)도 명확하게 알고 있다. 따라서 vpp는 void형 포인터에 적용되는 규칙 대신 일반 포인터의 규칙이 적용된다. 임의 타입(double int char)의 포인터를 대입받을 수 없으며 반드시 void *형 변수의 번지만 대입받을 수 있다.
또한 대상체가 분명히 정해져 있으므로 *연산자로 대상체를 읽거나 변경할 수 있고 ++, --, +n 등의 연산으로 앞 뒤 요소로 이동할 수도 있으며 같은 void **타입끼리 대입, 비교, 뺄셈도 가능하다. 

void *vp ;
void *av [5];
void **vpp ;
int i ,*pi=& i;

vpp = &vp ; // vvp(void 더블포인터 ) vp(void포인터) 가능
vpp = av ; // vvp(void 더블포인터 ) av(void포인터배열) 가능
vpp++;   // 일반 포인터 와 같은 타입으로 승격 되어 서 가능
* vpp;    // 가능
vpp=&pi // vvp(void 더블포인터 ) pi(int포인터) 불가능
** vpp;   // 간접 참조 불가능

--------------------------------------------------------------------------

void 더블 포인터 사용 예;

임의의 대상체(Type)를 받아 대신 메모리 할당을 받게 하는 함수 를 만들때쓰임

void alloc (void** mem, size_t size)
{
       * mem = malloc (size);
}

int main ()
{
        double int char
        void* vp ;
        alloc(&vp ,sizeof( int));
       *( int*)vp = 1234;
        printf("%d \n" ,*(int*) vp);
        free(vp );

        return 0 ;

}