配列が関数に渡された場合、配列がポインターに崩壊するケースを 1 つだけ知っています。配列がポインターに崩壊するすべてのケースを詳しく説明できる人はいますか?
質問する
252 次
1 に答える
13
C 2011 6.3.2.1 3:
sizeof演算子、…、単項&演算子のオペランドである場合、または配列の初期化に使用される文字列リテラルである場合を除き、「型の配列」型を持つ式は、型「型へのポインタ」を持つ式に変換されます。 」は、配列オブジェクトの最初の要素を指し、左辺値ではありません。
つまり、配列は通常、ポインターに崩壊します。規格には、そうでない場合がリストされています。
a[3]
. _ ただし、ここで実際に起こることは次のとおりです。
a
ポインタに変換されます。- 添字演算子は、ポインターと添字に作用して、オブジェクトを指定する左辺値を生成します。(特に
a[3]
は として評価され*((a)+(3))
ます。つまり、a
はポインターに変換され、ポインターに 3 が加算され、***** 演算子が適用されます。)
注: C 2011 のテキストには、「_Alignof演算子」が含まれています。これは標準の C 2018 バージョンで修正されたので、上記の引用から削除しました。のオペランド_Alignof
は常に型です。オブジェクトに実際に適用することはできません。したがって、C 2011 標準が 6.3.2.1 3 に含めるのは間違いでした。
于 2012-11-26T16:38:06.920 に答える