はC

2012-01-28 6 views
1
の配列と構造体

可能重複割り当て:C言語で
はC

Why does C++ support memberwise assignment of arrays within structs, but not generally?

を、struct即時割り当てしかしarrayできないでコピーすることができます。

int a[2] = {1, 2}; 
int a2[2] = a; /*illegal*/ 
int *p = a; /*assigned by reference*/ 

struct S {int i; int j;}; 
struct S s = {1, 2}; 
struct S s2 = s; /*assigned by value*/ 

arraystructの割り当てを区別するためにC言語で設計上の利点は何ですか?

@EDIT

実際には、我々は通常、他の多くの言語のようにC関数を呼び出すときの値で渡すのではと思いますが、引数がarrayのであれば、それは効果的に参照によって渡されます。

struct S {int i; int j;}; 
void pass_by_value(struct S s); 
struct S s2 = {1, 2}; 
pass_by_value(s2); /* s2 is copied to s */ 

void pass_by_ref(int a[]); 
int a2[] = {1, 2}; 
pass_by_ref(a2); /* a2 is referenced to a */ 

ためシンタックスシュガーありますarray Cプログラミングの普及:

array_var == &array_var 

我々はしたい場合はarray即時割り当て、レガシーコードでstructのようにコピーすることができるという新しい言語機能それから間違いなく壊れます。これはCでクローン化可能なarrayを持つ主要な障害の1つですか?

+1

技術的には、あなたが表示している行のどれも_assignments_ではありません。これらは_初期化_です。あなたは 'int a [2]をすることができませんでした。 int a [2] = {1,2};は正当なものであり、 'struct'sでは' struct S {int i; int j; } s; s = {1,2}; 'どちらでも構いませんが、C99では' s =(struct S){1、2}; 'を実行できます。 –

答えて

1

事前K & R C structオブジェクトも割り当てられませんでした。これが変更された時、配列も考慮されましたが、配列にこれを適応させるために多くの変更が必要なC標準が注目されました。

struct S { 
    int a[2]; 
}; 

を簡単に割り当てる:

0

あなたも行うことができます。配列を構造体にラップすると、間接的に配列を割り当てることができます。

+0

なぜdownvote?これは100%正しいです。 –