配列のメンバーごとの割り当てが構造体内でのみサポートされる理由
一般的な配列とは異なり、構造体内で定義された配列はメンバーごとの割り当てを利用できます。配列を別の配列に代入することは許可されていませんが (__
num1 = num2;//
struct1 = struct2;//) ;/pre>__)、示されているように以下:<pre class="brush:php;toolbar:false">int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1;
歴史的および哲学的根拠
この相違は C の進化に起因します。初期の反復では、配列は基本的にサイズ情報のないポインターでした。コンパイラに必要なデータが不足していたため、これにより割り当てが妨げられました。それにもかかわらず、構造体内の配列は、外側の構造体から型とサイズの情報を継承するという例外的な処理の恩恵を受けました。その結果、一般的な制約の影響を受けずに、構造体のコンテキスト内でメンバーごとにそれらを割り当てることができました。この慣行は、最新の C および C に引き継がれ、オープン配列を割り当てる際の実装上の課題を解決する特殊な機能です。一般的な配列割り当てを導入すると、曖昧さと互換性の問題が発生する可能性があります。そのため、制限は維持され、プログラマは明示的な配列コピーに memcpy を使用することが推奨されました。例外
関数パラメータは、配列メンバーを変更できる別の設定として登場しました。割り当てられました。次のコードを考えてみましょう。typedef int vec[3]; void f(vec a, vec b) { a = b; // pointer assignment }
以上が配列を直接代入できないのに、C/C の構造体内では代入できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。