44.6 연습문제: 포인터 연산과 역참조 사용하기

다음 소스 코드를 완성하여 55와 22가 각 줄에 출력되게 만드세요(Visual Studio, Windows).

practice_pointer_arithmetic_dereference.c

#include <stdio.h>

int main()
{
    int numArr[5] = { 11, 22, 33, 44, 55 };
    int *numPtrA;
    void *ptr;

    numPtrA = &numArr[2];
    ptr = numArr;

    printf("%d\n",         numPtrA           );
    printf("%d\n",            ptr             );

    return 0;
}

실행 결과

55
22

정답

 *(numPtrA + 2)
 *((int *)ptr + 1)
또는
 *(++(int *)ptr)

해설

numPtrA에는 numArr에서 세 번째 요소의 메모리 주소가 들어있습니다. 따라서 numPtrA로 다섯 번째 요소인 55를 출력하려면 포인터 연산으로 2를 더한 뒤 역참조하면 됩니다.

ptrvoid 포인터이므로 포인터 연산을 바로 할 수 없습니다. 따라서 int 포인터로 변환하여 1을 더한 뒤 역참조하거나 ++ 연산자를 앞에 붙여서 메모리 주소를 증가시킨 뒤 역참조하면 됩니다.