double val = 3.14;
double형 변수 val이 메모리 공간 0x1000~0x1007에 저장...
double *ptr1 = &val;
포인터변수 ptr1은 val의 주소값을 지니고 있음 (0x1000) 근데 이때 포인터 변수 *ptr는 val의 더불어 참조하는 대상의 자료형 정보도 알 수 있음
여기서 val의 자료형이 double형이기때문에 *ptr1이 가리키는 변수의 자료형인 double로 선언.
만약에 int *ptr1 = &val;로 하면 포인터 변수 ptr이 참조하는 대상의 자료형이 int형이라는 얘기
double **ptr2 = &ptr1;
마찬가지겠죠 더블포인터... ptr2는 ptr1의 주소값을 가리키고 ptr1은 그런데 double형으로 선언되어 있으니...
결국 ptr2도 double형으로 선언 되어야합니다.
그런데 포인터의 주소값은 double형이 아닌 int형 4바이트로 저장되어 있습니다. 포인터 변수도 메모리 어느 공간에 올라가 있으니깐요.
근데 그 메모리 공간에 올라갈때 int형으로 올라갑니다.
double *ptr1 = &val; 에서 ptr1의 메모리 주소는 int형으로 저장되어 있는겁니다.
단지 포인터 변수 *ptr1이 참조하는 메모리에 있는 자료형이 double형이라는것입니다.
이문장을 아래와 같이 바꾸는것은 포인터의 개념을 좀 더 차근차근히 이해하시면 아래 문장이 왜 틀렸는지 알 수 있으실 겁니다.
double val = 3.14;
int *ptr1 = &val;
int **ptr2 = &ptr1;
포인터의 개념을 아셔야 합니다.
포인터는 대상 객체의 주소값 뿐만 아니라 자료형도 저장하고 있습니다.
double val = 3.14;
double형 변수 val이 메모리 공간 0x1000~0x1007에 저장...
double *ptr1 = &val;
포인터변수 ptr1은 val의 주소값을 지니고 있음 (0x1000) 근데 이때 포인터 변수 *ptr는 val의 더불어 참조하는 대상의 자료형 정보도 알 수 있음
여기서 val의 자료형이 double형이기때문에 *ptr1이 가리키는 변수의 자료형인 double로 선언.
만약에 int *ptr1 = &val;로 하면 포인터 변수 ptr이 참조하는 대상의 자료형이 int형이라는 얘기
double **ptr2 = &ptr1;
마찬가지겠죠 더블포인터... ptr2는 ptr1의 주소값을 가리키고 ptr1은 그런데 double형으로 선언되어 있으니...
결국 ptr2도 double형으로 선언 되어야합니다.
그런데 포인터의 주소값은 double형이 아닌 int형 4바이트로 저장되어 있습니다. 포인터 변수도 메모리 어느 공간에 올라가 있으니깐요.
근데 그 메모리 공간에 올라갈때 int형으로 올라갑니다.
double *ptr1 = &val; 에서 ptr1의 메모리 주소는 int형으로 저장되어 있는겁니다.
단지 포인터 변수 *ptr1이 참조하는 메모리에 있는 자료형이 double형이라는것입니다.
이문장을 아래와 같이 바꾸는것은 포인터의 개념을 좀 더 차근차근히 이해하시면 아래 문장이 왜 틀렸는지 알 수 있으실 겁니다.
double val = 3.14;
int *ptr1 = &val;
int **ptr2 = &ptr1;
포인터를 가져올 범위라고 생각하시면 어떨까요?
'1' = 0011 0001 '2' = 0011 0010 '3' = 0011 0011 '4' = 0011 0100
출력되는건 875770417 이에요 0011 0100 0011 0011 0011 0010 0011 0001
포인터의 자료형을 가져올 범위라고 생각하시면 편할것같습니다.
int 형포인터는 가리키는 주소로부터 4 byte를 가져오고, char 형 포인터는 가리키는 주소로부터 1byte를 가져오고 이런식으로요.
흘러가고있는 지금 이 시간에 충실하자.
댓글 달기