심심풀이 C 언어 퀴즈에 도전
“Jong10++:: 심심풀이 C 퀴즈 하나” 에서 트랙백
C 언어에서 포인터를 사용했을 때 주소 계산과 관련된 문제다. C 언어는 죽었다 깨도 강타입 언어라고 부르기 힘들다는 점을 이용한 문제.
포인터인 어떤 p에 대해서,
p + int_type
과int_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
로 나온다.