ポインタへの配列風アクセス
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/04 02:56 UTC 版)
「糖衣構文」の記事における「ポインタへの配列風アクセス」の解説
C言語では、例えばオフセット付きでポインタをデリファレンスするような式 *(p + ofs) を、配列へのアクセス風に p[ofs] とも書ける。この糖衣構文は、見た目の単純さだけではなく、括弧の手前に書かれるものが先頭アドレスで括弧の中がオフセットであるというように、コードの意味をより明確で分かりやすくもしている。また、C言語の関数には配列そのものを引数として渡すことはできず、代わりに配列先頭要素へのポインタを渡すことで代替するが、例えば関数宣言void func(double *x, size_t count)は、void func(double x[], size_t count)と書くこともできる。後者は引数として配列を渡すことを想定していることがより明確になる。なお、配列変数のシンボルは、式の中では配列先頭要素へのポインタと解釈されるため、例えば要素数10の固定長配列double a[10]の先頭要素へのポインタを関数funcの実引数として渡す場合に、func(&a[0], 10)と書けるだけでなく、func(a, 10)と書くこともできる。 一方で、これらの糖衣構文は、配列とポインタはデータ構造としても文法要素としても異なるものである(例えば extern int *a; という宣言と extern int a[]; という宣言とは、それぞれ違うものである)という事実を見失わせ、あらゆる場所で配列とポインタは可換であるというように誤った解釈や混同をしてしまう要因にもなっている。 なお、前述の p[ofs] を ofs[p] のように書くこともできる。例えば文字列リテラルにインデックスでアクセスする、整数値から十六進数表現を得るための、次のようなコード "0123456789abcdef"[n] の代わりに n["0123456789abcdef"] と書くこともできる。後者も構文的に問題はなく、全く同じ意味となる。
※この「ポインタへの配列風アクセス」の解説は、「糖衣構文」の解説の一部です。
「ポインタへの配列風アクセス」を含む「糖衣構文」の記事については、「糖衣構文」の概要を参照ください。
- ポインタへの配列風アクセスのページへのリンク