• 2022. 5. 18.

    by. 데브촙

    반응형

    대상의 크기가 정해져 있지 않은 void *형 포인터

    void 키워드 : 정해져 있지 않다.

    포인터 변수가 가리키는 대상의 크기를 모를 때 void * 형을 사용

    사용할 메모리의 시작 주소만 알고 끝 주소를 모를 때 void*형 포인터 사용

    int data = 0;
    void *p = &data;	
    *p = 5;	// 오류 발생, 대상 메모리의 크기가 정해지지 않음

     

    void * 는 주소를 사용할 때 반드시 사용할 크기를 표기해야 한다

    int data = 0;
    void *p = &data;	
    *(int *)p = 5;	// casting 문법을 사용하여 대상의 크기를 4바이트로 지정

     

    void * 형 포인터 활용하기

    - void * 는 자신이 사용할 대상의 크기 지정을 잠시 미룰 수 있다는 장점을 지님
    - main 함수의 지역 변수의 주소를 받아 1을 대입하는 MyFunc 함수
    (MyFunc 함수에 전달되는 주소의 형식이 char *, short * , int * 중 하나)

    void MyFunc(char *p_char, short *p_short, int *p_int) // 어떤 형식의 주소 값이 전달될지 모르기에 세 개의 포인터를 매개변수로 둠
    {
    	if(p_char != NULL) *p_char = 1;
    	else if(p_short != NULL) *p_short = 1;
    	else *p_int = 1;
    }
    
    void main()
    {
    	short data= 5;
    	MyFunc(NULL, &data, NULL);
    }

     

    void * 형 포인터를 사용하여 지역 변수의 값 변경하기

    void MyFunc(void *p, char flag)
    {
    	// flag 에 전달된 값에 따라 형 변환하여 전달된 주소에 1을 대입
    	if(flag == 0) *(char *)p = 1;		// flag가 0이면 char형
    	else if(flag == 1) *(short *)p = 1;	// flag가 1이면 short형
    	else *(int *)p = 1;			// flag가 2이면 int형
    }
    
    void main()
    {
    	short data= 5;
    	// data 변수는 short 형 이기 때문에 short *를 의미하는 1을 함께 전달
    	MyFunc(&data, 1);
    }
     

    void *를 사용하여 대상 메모리의 크기 조절하기

    #include <stdio.h>
    int GetData(void *p_data, char type)
    {
    	int result = 0;
    	// type 매개변수에 전달된 값을 기준으로 형 변환을 달리함
    	if(type == 1) result = *(char *)p_data;		// 0x78(1바이트) 저장
    	else if(type == 2) result = *(short *)p_data;	// 0x5678(2바이트)
    	else if(type == 4) result = *(int *)p_data;	// 0x12354678
    	return result;
    }
    
    void main()
    {
    	int data = 0x12345678;
    	printf(“%X\n”, GetData(&data, 2));
    }

     

    포인터 변수에 직접 형 변환을 사용하는 형식은 모든 포인터에서 사용할 수 있는 개념

    int data = 0x12345678
    char *p = (char *)&data;	// 서로 자료형이 맞지 않아 (char *)로 형 변환
    *p = 5;				// data 변수의 시작 1바이트에 5를 넣으면 0x12345605로 변경
    *(short *)p = 0;	// data 변수의 시작 2바이트에 0을 넣으면 0x12340000 으로 변경

    반응형

    'C' 카테고리의 다른 글

    표준 입력 함수  (0) 2022.05.19
    포인터와 대상의 크기  (0) 2022.05.17
    포인터 변수의 주소 연산  (0) 2022.05.16