くだらないタイトルで申し訳ありませんが、この問題をより適切に説明する方法がわかりません。
次の意味は何ですか:
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
へのポインターに割り当てることはできません(これが上記のエラーの理由です: のサイズを知る必要があります)。宣言する配列)M
N!=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 []
。したがって、x
inint (*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を使用してから、実行時にメモリを割り当てます。