KDOC 143: Cの添字記法は単なるシンタックスシュガーである
この文書のステータス
- 作成
- 2024-04-29 貴島
- レビュー
- 2024-05-06 貴島
概要
C言語での配列の添字記法は、単なるポインタ操作のシンタックスシュガーになっている。添字の数値を、単純に配列の先頭をさすポインタに足している。 arr[1]
は、 *(arr+1)
とも書ける。
#include <stdio.h> void main() { int nums[3] = {1, 2, 3}; int a; // 同じ意味のさまざまな書き方 printf("%d\n", nums[1]); printf("%d\n", *(nums+1)); printf("%d\n", 1[nums]); }
2 2 2
これを、アセンブリを見て確かめる。
実演
↓生成されるアセンブリが全く同じなのを確認した。
アセンブリに、添字で指定したままの数値は登場しない。アドレス計算された後の値になっている。コードに現れる添字はあくまでインデックスであって、配列の型の大きさによってアドレスに足す値は変わる。コンパイラは型情報を読んで、要素のアドレスを計算してくれている。
関連
- KDOC 140: 『自作エミュレータで学ぶx86アーキテクチャ』。とても詳しく解説されていたので、試した