くだらないタイトルで申し訳ありませんが、この問題をより適切に説明する方法がわかりません。
次の意味は何ですか:
int (*x)[];
それを初期化する方法は?
私はそれがint *x[]以来ではないことを知っています:
int a,b;
int (*x)[] = {&a, &b};
コンパイルされません。
前もって感謝します。
型宣言には式のような構文があるため、式と同じように解析します。
x x is
*x a pointer
(*x)[] to an array of unknown dimensions
int (*x)[] of int
優先順位のルールは、右側の演算子が左側の演算子よりも強く結合し、いずれの場合も、要素に近い演算子がより強く結合し、最後に括弧を使用してこれらの結合を変更できるというものです。
int *x[]; is an array of pointers,
int *(x[]); as is this.
int (*x)[]; whereas here, the parentheses change the bindings.
cdeclを使用すると、タイプを簡単に判別できます。
x を int の配列へのポインタとして宣言する
xしたがって、配列のアドレスで初期化できます。
int a[]; // conceptual: error if compiled
x = &a;
配列のサイズはその型の一部であるため、 size の配列のアドレスを sizeの配列Nへのポインターに割り当てることはできません(これが上記のエラーの理由です: のサイズを知る必要があります)。宣言する配列)MN!=M
int b[5];
int c[6];
int (*y)[6];
y = &b; // error
y = &c; // OK
int (*x)[]空の int 配列へのポインターに使用します。ただし、C++ では空の配列を初期化することはできません。それを定義できるのはあなただけです。空でない配列を使用する必要があります。
int a[2] = {1, 2};
int (*x)[2] = &a;
int (*x)[]手段xは int 配列へのポインタです。次のようにできます。
int a[] = {1, 2};
int (* b)[2] = &a;
配列型の変数を解釈するときは、右から左に移動する必要があります。例えば
int *x[]
は配列であることを示しますx。配列内の要素は、int *int へのポインターとして型指定されます。したがってx、要素が int ポインターである配列を表します。ただし、括弧は演算子の優先順位を変更します。*が最初に解釈さxれ、型が であるポインタであることを示しますint []。したがって、xinint (*x)[]は int 配列へのポインターであり、それに応じて初期化する必要があります。
それがどのように作成されたかを知るまで、C のタイピングにも問題がありました。
C では、型は、その型の変数を使用する方法で記述されます。
したがって、次のように表示されます。
int *x;
これは、式*xが 型であることを意味し、 int へのポインター型の変数もint同様です。x
そして、あなたが見た場合:
int x[5];
x[3]これは、式が 型intであることを意味し、x配列の int 型の変数でもあります。
だから、あなたの式に到達するには:
int (*x)[];
これは、式*xが型(つまり、未知のサイズint[]の配列) であることを意味します。intしたがってx、int 配列へのポインター型の変数です。
int(* x)[] これは、xがint配列へのポインタであることを意味します。次のように初期化します。int(* x)[]; int a [10]; x =&a;
int * x [] これは、xがint int *x[10]へのポインタの配列であることを意味します。int a [10]; x [0] = a;
私の意見では、常に初期化された配列変数を使用するか、*x[]の代わりにint**xを使用してから、実行時にメモリを割り当てます。