配列の添字は配列の境界を越えることができますか?
次のコードが C 標準に準拠しているかどうかという疑問が生じます:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
ログイン後にコピー
具体的には、このコンテキストにおける &array[5] の有効性は次のとおりです。
C 規格
C99 ドラフト規格による:
-
§6.5.2.1、パラグラフ 2: "E1[E2] は (*((E1) と同一です) (E2)))"
-
§6.5.3.2、段落 3 (強調): "オペランドが [] 演算子の結果である場合、& 演算子も単項 * [] によって暗示される演算子が評価され、その結果は & 演算子が削除され、[] 演算子が演算子."
-
§6.5.6、段落 8: "式 P が配列オブジェクトの最後の要素の 1 つ先を指す場合、式 (P) 1 は最後の要素の 1 つ先を指します式 Q が配列オブジェクトの最後の要素の 1 つ先を指す場合、式 (Q) - 1 は配列の最後の要素を指しますobject."
結論
これらの規定は次のことを示しています:
- ポインターは正当にオブジェクトの末尾を超えた 1 つの要素を指すことができます。 array (逆参照なし).
- &array[5] は以下と同等です&*(配列 5)、これは (配列 5) と等価です。
- (配列 5) は配列の終わりの 1 つ先を指します。
- &array[5] はそうではありません逆参照になりますが、C 標準によれば正当です。
以上が`&array[5]` は配列の境界を越える C の有効なポインタですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。