
この記事はかなり昔に執筆されており、誤りを含む場合があります。
配列の添字演算子[]をトリッキーに扱う裏技をご紹介します。 以下のコードを見てください。なんじゃこりゃ?!こんなコード動くのか?? と思わず唸ってしまいそうですが、 実はこのコード、正常に動作します^^;) 実行結果)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"]);と同義になり、「d」が表示されます。(← 配列は0-baseである事に注意) 同様に8行目のprintf("%c\n", "abcdef"[3]);は、printf("%c\n", 2[p]);と同義になり、「C」が表示されます。 9行目のprintf("%c\n", p[2]);はputs(&1[p]);と同義になり、p[1]のアドレスをputs()関数に渡している為、"ABCDEF"の2文字目からが表示されます。puts(&p[1]);
