📚책읽기

[C/C++] 포인터 이해 확인 문제

공대 컴린이 2022. 3. 7. 15:32
728x90
  • 문제 1.
short sArr[10] = { 1,2,3,4,5,6,7,8,9,10 };

int* pI = (int*)sArr;

int iData = *((short*)(pI + 2));

printf("1번 문제 정답 : %d\n", iData);

문제 풀이
short 배열은 2byte 단위로 이루어져 있다.
pI는 int형 포인터이기 때문에 4byte 단위로 해석하게 된다.
이후 pI에 +2를 했기 때문에 주소는 4byte씩 2번 해석되어 8byte가 넘어가게 된다.

[0]=1 (2byte) / [1]=2 (2byte) / [2]=3 (2byte) / [3]=4 (2byte) / [4]=5 (2byte) / [5]=6 (2byte) / ...

위와 같은 배열의 메모리 구조에서 8byte가 넘어가면 [4]=5의 시작점에 포인터가 위치하게 된다.
이때 (pI + 2)를 접근하기 직전에 다시 (short*) 포인터로 해석의 단위를 맞춰주었기 때문에 [4]=5의 시작점에서 2byte 단위로 해석하여 결과 값인 iData는 5가 된다.

만약 (pI + 2)로 접근한 뒤 (short*) 포인터로 캐스팅을 하지 않았다면 (pI + 2)가 int형이기 때문에 4byte 단위로 주소를 해석하여 5와 6의 두 숫자를 한 번에 읽게 되고, 결과 값인 iData가 생각지 못한 숫자로 도출된다.

  • 문제 2.
char cArr[2] = { 1,1 };

short* pS = (short*)cArr;

iData = *pS;

printf("2번 문제 정답 : %d\n", iData);

문제 풀이
char형 배열인 cArr은 1byte씩 이루어져 있다.
그러나 short형 포인터 변수는 2byte 단위이기 때문에 cArr를 참조할 때 2byte씩 해석하게 된다.
따라서 iData를 short형 포인터 변수인 pS로 바로 접근하면 {1, 1}를 하나의 숫자로 보게 된다.
{1, 1}를 2byte의 정수로 해석하면 8비트{1} + 8비트 {1} 의 메모리 구조가 형성되어
"0000 0001 0000 0001"로 읽히고, 그 결과 256 + 1이 연산되어 iData는 257이 된다.


 

728x90