⭐️Pointer types, void pointers
1. Pointer types - Strongly type
1) Pointer는 strongly type(강형 타입)입니다.
int형 변수의 주소를 저장하고 싶다면, int* - 정수형 포인터 변수를 선언하여 저장해야 합니다.
2) Why do we need these strong types?
포인터는 주소를 저장하는 변수이므로 하나의 type. 즉, generic type으로 사용하면 되지 않을까?
3) 2번에 대한 Answer
pointer 변수를 그저 주소를 저장하는데에만 쓰지 않고, 주소를 de-referencing하여 변수의 값을 access & modify하기 때문에 strongly type입니다.
자료형마다 사용하는 메모리의 양이 다르고 데이터를 저장하는 방법이 다르기 때문에 형 변환에 엄격한 strongly type입니다.
(예를 들어 int형은 메모리를 4 bytes를 char형은 1 bytes만을 차지)
int a = 1025;
int *p; // p의 주소를 200이라고 가정
p = &a; // a의 주소를 801이라고 가정
printf("size of integer is %d\n", sizeof(int));
printf("Address = %d, value = %d\n", p, *p);
printf("%d\n", p);
printf("%d", &p);
[출력 결과]
4 // int의 크기
Address = 200, value = 1025 // p의 주소, p가 가리키는 주소에 있는 값(a의 값)
801 // a의 주소
200 // p의 주소
1-1. 위의 코드에서 포인터 변수 p를 강제 형 변환 한다면?
char* p0;
p0 = (char*)p; // int -> char typecasting
printf("size of char is %d\n", sizeof(char)); // 1 byte
// 주소는 a의 주소를 제대로 출력하지만, value는 이상한 값이 들어온다.
printf("Address = %d, Value = %d", p0, *p0);
생각하기엔 강제 형 변환을 실행한다면 정상적으로 작동할 것 같지만 그렇지 않습니다.
왜 그럴까요?
위의 코드를 예로 들어봅시다.
1025를 2진법으로 나타내면
00000000 00000000 00000100 00000001입니다.
int를 char로 강제 형 변환을 실행하게 되면 4 bytes 중에 제일 오른쪽에 있는 byte(rightmost byte)가 들어가게 됩니다.
따라서 00000001이 출력됩니다.
결론 : 자료형이 이미 선언된 포인터 변수는 강제 형 변환이 불가능
2. Generic pointer type - void pointers
pointer에도 Generic pointer type이 있습니다.
이러한 포인터 타입은 특정한 자료형에 대응되지 않는(does not correspond) 자료형입니다.
void pointer라고도 불립니다.
void* ptr;
ptr = &p; // 강제 형 변환 필요 X
void pointer는 다른 타입의 포인터 변수를 담을 수 있으며, 강제 형 변환이 따로 필요없습니다.
하지만, de-referencing이 불가합니다.
printf("%d", *ptr); // compile error!
ptr + 1; // compile error!
잘못 알고 있는 부분은 언제나 지적 환영합니다!
참고 영상: https://www.youtube.com/watch?v=JTttg85xsbo&list=PL2_aWCzGMAwLZp6LMUKI3cc7pgGsasm2_&index=3