본문 바로가기

Programming/C++

03. void 형 포인터

void 형 포인터는 함수와 포인터 변수에만 적용 되는 타입니다.
일반 변수에는 사용 할 수 없다.

int i = 1;
double d = 1.0;
char c = 'a';
void *vp ;
vp = &i ;
vp = &d ;
vp = &c ;
void 형 포인터는 어떠한 대상체 든 캐스팅 없이 가릴킬수 있다
int* pi ;
double* pd ;
char* pc ;
pi = (int *)vp;
pd = (double *)vp;
pc = (char *)vp;
반대로 임의의 포인터에 void형 포인터를 대입할때는 반드시 캐스팅을 하여야 한다.

void* 형 포인터는 *연산자를 쓸 수 없다.
void* 형 포인터는 임의의 대상체에 대한 번지값만을 저장하며 이위치에 어떤 값이 들어있는지 알지 못한다 그래서 *연산자로 이 포인터가 가리키는 메모리에 값을 읽을 수 없다.
대상체의 타입이 정해져 있지 않으므로 몃바이트를 읽어야 할지 또는 어떤 식으로 해석 해야 할지 알수가 없다 또한 증감 연산자도 불가능하다

활용 예제 : 
void arDump (void* array, int length)
{
        int i ;
        for (i =0; i< length; i ++)
       {
               // printf 서식검색하여확인하자
               // %02X = 부호없는16 진수정수번째 자리 까지만 보인다
               printf("%02X" ,*(unsigned char*)array +i);
               // *(unsigned char*) = 부호없는정수포인터형변환 char(1바이트)
               // array+i = 메모리주소에서1바이트씩메모리를옴기면서읽어들인다
       }
        printf("\n" );
}

void main ()
{
        int ari [] = {1,2,3,4,5};
        char arc [] = "Pointer";
        printf("ari size = %d \n" ,sizeof( ari));//20
        printf("arc size = %d \n" ,sizeof( arc));// 8
        arDump(ari , sizeof( ari));// ari= void* 형변환되어함수로넘어가고 sizeof(ari)=20(바이트) 전채크기를넘어간다
        arDump(arc , sizeof( arc));// arc= void* 형변환되어함수로넘어가고 sizeof(arc)=8(바이트) 전채크기를넘어간다

}