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 129: 『ポインタ理解のためのアセンブリ入門』。Cの配列などのプリミティブと生成アセンブリを比べる本
- 検証: KDOC 140: 『自作エミュレータで学ぶx86アーキテクチャ』。解説されていたのを試した
- 補足: KDOC 141: Cのポインタ操作をアセンブリで見る。ポインタ経由の読み書きが、アセンブリではアドレスを計算してそこへ読み書きする命令になる点が共通する