심심풀이 C 언어 퀴즈에 도전

Jong10++:: 심심풀이 C 퀴즈 하나” 에서 트랙백

C 언어에서 포인터를 사용했을 때 주소 계산과 관련된 문제다. C 언어는 죽었다 깨도 강타입 언어라고 부르기 힘들다는 점을 이용한 문제.

포인터인 어떤 p에 대해서,

  • p + int_typeint_type + p 의 결과는 같고
  • 배열 인덱스 계산에서도 이런 종류의 교환 법칙 비슷한게 성립한다. 즉 a[index] = index[a]

정도가 성립한다.

이를 이용하면 int* a에서 a + 2, 2 + a, &a[2], &2[a] 는 모두 같은 주소를 가리킨다. 그래서 Jong10님의 문제는 다음 코드로 검사해보면 되겠다. (물론 C의 포인터 계산을 알면 답은 앞에서 설명한 내용으로 추론할 수 있다)

int aa[] = {0, 10, 20, 30};
printf("%d %d %d %d\n", aa[2], *(aa + 2), *(2 + aa), 2[aa]);

출력은 역시,

20 20 20 20

로 나온다.