ほとんどの場合、配列型 (「の N 要素配列」) の式は、ポインター型 (「へのポインター」)Tの式に「減衰」する / 変換される / に置き換えられ、式の値は次のようになります。配列の最初の要素のアドレス。 T
したがって、宣言を仮定すると
int a[10];
式の型は、a「の 10 要素配列int」、またはint [10]です。ただし、ほとんどのコンテキストでは、式の型は「へのポインタint」またはint *に変換され、式の値は と同等になり&a[0]ます。
この規則の例外は、配列式がsizeofまたは 単項演算子のオペランドである場合&、または宣言で別の配列を初期化するために使用される文字列リテラルである場合です。
したがって、上記の宣言に基づいて、次のすべてが当てはまります。
式のタイプは値に減衰します
---------- ---- --------- -----
a int [10] int * a の最初の要素のアドレス
&a int (*)[10] n/a 配列のアドレス。
最初のアドレスと同じ
エレメント
&a[0] int * n/a の最初の要素のアドレス
*a int 該当なし a[0] の値
sizeof a size_t n/配列内のバイト数
(10 * sizeof (int))
sizeof &a size_t 該当なし へのポインタのバイト数
int の配列
sizeof *a size_t 該当なし int のバイト数
sizeof &a[0] size_t n/int へのポインタのバイト数
式a、&a、および&a[0]はすべて同じ値( の最初の要素のアドレス) を持ちますaが、型が異なることに注意してください。タイプは重要です。次のことを前提とします。
int a[10];
int *p = a;
int (*pa)[10] = &a;
と の両方が の最初の要素pをpa指しています。aこれはアドレス にあると仮定します0x8000。行を実行した後
p++;
pa++;
ただし、p次の整数( 0x8004、4 バイトintの s と仮定) をpa指し、整数の次の 10 要素配列を指します。つまり、a( 0x8028) の最後の要素の後の最初の整数です。