-
포인터 타입 캐스팅(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 댓글