配列の添字演算子[]をトリッキーに扱う裏技をご紹介します。
以下のコードを見てください。
1 : #include <stdio.h>
2 :
3 : int main(void)
4 : {
5 : char * p = "ABCDEF";
6 :
7 : printf("%c\n", 3["abcdef"]);
8 : printf("%c\n", 2[p]);
9 : puts(&1[p]);
10 :
11 : return 0;
12 : }
なんじゃこりゃ?!こんなコード動くのか?? と思わず唸ってしまいそうですが、
実はこのコード、正常に動作します^^;)
実行結果)
それでは説明に移ります。
Cコンパイラでは、配列arrと添字iに対して、arr[i] は *((arr) + (i)) として解釈 されます。
従って配列の添字演算子[]の二つのオペランドは交換可能 であり、
arr[i]と書いても i[arr]と書いても同じ意味になります。
・・・たった3行の説明ですが、初めてこの交換法則を知った人は、非常にビックリしたのではないでしょうか??^^;)
この法則を踏まえて冒頭のコードを読んでみると、
7行目の
printf("%c\n", 3["abcdef"]);
は
printf("%c\n", "abcdef"[3]);
と同義になり、「d」が表示されます。(← 配列は0-baseである事に注意)
同様に8行目の
printf("%c\n", 2[p]);
は、
printf("%c\n", p[2]);
と同義になり、「C」が表示されます。
9行目の
puts(&1[p]);
は
puts(&p[1]);
と同義になり、p[1]のアドレスをputs()関数に渡している為、"ABCDEF"の2文字目からが表示されます。