20
2017-11-25 20:47:29
1
제가 알기로 포인터 변수의 선언에서 타입은 '시작주소로 부터 몇 바이트까지를 내용으로 할 것이냐'를 의미하는 걸로 알고있는데요
-> 아뇨 포인터는 주소값을 담을 수 있음 정도로 보시면 됩니다.
int arrIntShort[3] = { 0, 1, 2 };
int arrIntLoing[5] = { 0, 1, 2, 3, 4 };
int * ptrIntShort = arrIntShort;
int * ptrIntLong = arrIntLong;
에서 ptrIntShort 은 세 int를 담는 배열의 시작 주소를 담습니다. int를 4 byte라고 했을때 "몇 받이트까지를 내용으로 할 것인지"라면 ptrIntShort은 0x0C일까요? 그렇다면 ptrIntLong은 0x20 이고요? 심지어 함수의 포인터(아마 아직 안 배우셨을꺼 같긴 하지만)는 데이터가 아닌 코드의 메모리 주소를 담게 되는데 그 코드의 길이? 와 같은 상황이 되겠네요.
즉, 포인터 변수 ptr은 주소이기때문에 언제나 4바이트이고
-> 아뇨 32bit 시스템이라면 메모리의 주소가 32자리의 2진수이고 이는 8bit이 1byte이므로 4byte로 표현이 가능한 32bit 시스템인 경우에는 맞지만
64bit인 경우는 메모리 주소를 64bit으로 나타내는데 이는 8bytes로 나타내야 하기 때문에 8bytes인 경우도 있습니다.
앞의 char는 그 주소로 부터 2바이트까지를 내용으로 한다는게 되는데
-> 1byte
char a;
printf("%d", sizeof( a ) );
그렇게되면 *ptr에는 'a'만 들어가야 되는거 아닌가요? 그리고 *(ptr+1)은 'b'가 되야하는거구요...
-> ptr[0] == *ptr
ptr[1] == *(ptr+1)
ptr[2] == *(ptr+2)
*(ptr+2) 의 해석 방법
-. ptr은 주소를 담고 있음
-. ptr+2은 다음 다음 칸의 주소를 말함. 그럼 1칸은 얼마인지를 알아야 2칸을 뒤로 갈 수 있는데, 그래서 담고 있는 한 칸의 크기가 char이고 그게 1byte이니까 2칸 뒤면 prt에 2를 더하면 되는군. 즉, ptr+2는 ptr보다 2만큼 큰 값임.
-. *(ptr+2)는 2칸 뒤의 값
printf("Address of ptr + 0: %p and Value is %cn", (void *) (ptr+0), *(ptr+0) );
printf("Address of ptr + 2: %p and Value is %cn", (void *) (ptr+2), *(ptr+2) );