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

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

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

포인터인 어떤 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

로 나온다 :)

  1. 사실 내가 사랑해 마지 않는 언어 C++도 이거랑 거의 비슷한 수준의 타입 시스템을 가지고 있다. 다만 타입 강제력이나 cast 연산자 같은 면에서는 약간의 발전이 있긴하다. []

Published by

rein

나는 ...

One thought on “심심풀이 C 언어 퀴즈에 도전”

  1. 잘 모르시는 분들을 위해서 코멘트 살짝 남겨봅니다.

    C가 내부적으로 a[b]를 *(a+b)로 해석하기 때문에 가능한 일입니다.
    + 는 아시다시피 commutative 합니다.

Leave a Reply