ホームページ > バックエンド開発 > C++ > C では、末尾の 1 つ先の配列要素のアドレスを取得することは合法ですか?

C では、末尾の 1 つ先の配列要素のアドレスを取得することは合法ですか?

Linda Hamilton
リリース: 2024-12-18 01:40:10
オリジナル
472 人が閲覧しました

Is it Legal in C   to Take the Address of an Array Element One Past the End?

最後から 1 つ先の配列要素のアドレスを取得できますか?

次のコードはプログラミングで議論の対象となっていますコミュニティ:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
ログイン後にコピー

特に、この文脈において &array[5] が正当な C コードであるかどうかという問題

C 標準のスタンス

C 標準によると、特に:

  • §6.5.2.1 : 添字付き指定 (E1[E2]) は以下と同等です。 *((E1) (E2)).
  • §6.5.3.2: [] 演算子の結果として得られる式のアドレスを取得する場合、[] を置き換えることと同じです。 .

の影響&array[5]

これらのルールを &array[5] に適用すると、次のようになります:

  • &array[5] は &array[0] 5 と同等です。
  • &array[0] 配列の終わりから 1 要素後の 5 ポイントarray.

合法ですか?

はい、合法です。標準では、逆参照されない限り、ポインタが配列の末尾を超えた 1 つの要素を指すことを明示的に許可しています。この場合、&array[5] はアドレスを取得するためにのみ使用され、そのアドレスの値にアクセスするためではないため、標準で許可されている範囲内にあります。

との違いarray 5 or &array[4] 1?

&array[5] の動作は array 5 または &array[4] 1 とは異なりますこれは、演算子と [] の優先順位と、[] によって暗示される単項 * 演算子の動作の組み合わせによるものです。具体的には:

  • 配列 5 は *(配列 5) として評価され、配列の末尾の 1 つ先を指すポインターを逆参照しようとします。これは未定義の動作です。
  • &array[4] ] 1 は &*(配列 4) 1 として評価され、これは配列 5 と同等であるため、配列の終わりの 1 つ先を指すポインターの逆参照も試行します。 array.

対照的に、&array[5] は、& 演算子が削除され、[] 演算子が演算子に変更されたかのように評価され、配列 5 になりますが、単項の評価は行われません。 * 演算子。

以上がC では、末尾の 1 つ先の配列要素のアドレスを取得することは合法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート