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

これを、アセンブリを見て確かめる。

実演

↓生成されるアセンブリが全く同じなのを確認した。

アセンブリに、添字で指定したままの数値は登場しない。アドレス計算された後の値になっている。コードに現れる添字はあくまでインデックスであって、配列の型の大きさによってアドレスに足す値は変わる。コンパイラは型情報を読んで、要素のアドレスを計算してくれている。

関連