“Jong10++:: 심심풀이 C 퀴즈 하나” 에서 트랙백
C 언어에서 포인터를 사용했을 때 주소 계산과 관련된 문제다. C 언어는 죽었다 깨도 강타입 언어라고 부르기 힘들다는 점을 이용한 문제 ((사실 내가 사랑해 마지 않는 언어 C++도 이거랑 거의 비슷한 수준의 타입 시스템을 가지고 있다. 다만 타입 강제력이나 cast 연산자 같은 면에서는 약간의 발전이 있긴하다.))
포인터인 어떤 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
로 나온다 :)
잘 모르시는 분들을 위해서 코멘트 살짝 남겨봅니다.
C가 내부적으로 a[b]를 *(a+b)로 해석하기 때문에 가능한 일입니다.
+ 는 아시다시피 commutative 합니다.