ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인터 타입 캐스팅(void 포인터)
    프로그래밍/C, C++ 2019. 5. 2. 00:19

    포인터 타입 캐스팅2

    포인터는 포인터가 가리키고 있는 것을 어떻게 바라보겠냐는 것의 대한 선언(?)이라고 생각합니다

        int *ptr; // int 을 바라본다
        char *ptr1; // char 을 바라본다
        double (*ptr2)[4]; // double [4] 을 바라본다

    그래서 이전 포스트에서 int 변수를 char *로 강제 캐스팅한 뒤, 받아서 가리켜서 출력해봤습니다


    ---

    void 포인터란?

    void 포인터란 아무 포인터나 다 들어갈 수 있습니다. (함수포인터 제외)


    다만 포인터는 참조하고 있는 것이 어떤 크기인지 알아야 해당 크기만큼 가져오게됩니다


    int 형은 4바이트, int [4]는 16바이트, char 형은 1바이트겠죠?!


    그래서 void 형 포인터를 사용할 때는 바라보는 기준이 없기 때문에 타입 캐스팅이 필요합니다.

    int main(){
        int a = 0x123456;
        void *ptr = &a;
        printf("%x\n", *(int *)ptr); // ptr을 int *로 캐스팅한 뒤, 다시 참조 -> 123456 출력
        printf("%x\n", *(char *)ptr); // ptr을 char *로 캐스팅한 뒤, 참조 -> 56, 이전 포스트 참조
    }

    만약 그냥 *ptr을 출력하면, 얼마나 메모리를 읽어야하는지 모르기 때문에 에러가 발생합니다


    void 포인터의 장점은 아무거나 다 때려넣을 수 있다는 것입니다. 단점은 사용자의 책임이 많아진다는 것입니다


    대표적인 void 포인터는 malloc입니다.


    malloc은 메모리를 할당 받는데, 내가 무슨 타입의 메모리를 받는지 알려주지 않고
    단지 크기만 넘겨줍니다.


    함수원형

    void * malloc(size_t size);

    그래서 사용자가 malloc을 사용할 때는 캐스팅을 해서 사용합니다

    int *arr = (int *) malloc( sizeof(int) * array_size); // 캐스팅
    arr[0]; // 접근

    이런식으로 사용합니다만, 이것말고 언제 사용되는 지 잘모르겠네요..






    질문이나 잘못된 점을 댓글 달아주시면 바로 피드백하겠습니다!

    '프로그래밍 > C, C++' 카테고리의 다른 글

    리틀 인디언과 빅 인디언  (0) 2019.05.03
    포인터 타입 캐스팅  (0) 2019.04.30
    함수 포인터  (0) 2019.04.26
    포인터와 배열1  (0) 2019.04.21
    포인터와 배열2  (0) 2019.04.21

    댓글

Designed by Tistory.