19

くだらないタイトルで申し訳ありませんが、この問題をより適切に説明する方法がわかりません。

次の意味は何ですか:

int (*x)[];

それを初期化する方法は?

私はそれがint *x[]以来ではないことを知っています:

int a,b;
int (*x)[] = {&a, &b};

コンパイルされません。

前もって感謝します。

4

6 に答える 6

26

型宣言には式のような構文があるため、式と同じように解析します。

      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.
于 2012-04-27T12:27:30.293 に答える
13

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
于 2012-04-27T12:23:57.097 に答える
3

int (*x)[]空の int 配列へのポインターに使用します。ただし、C++ では空の配列を初期化することはできません。それを定義できるのはあなただけです。空でない配列を使用する必要があります。

int a[2] = {1, 2};
int (*x)[2] = &a;
于 2012-04-27T12:24:44.453 に答える
2

int (*x)[]手段xは int 配列へのポインタです。次のようにできます。

int a[] = {1, 2};
int (* b)[2] = &a;

配列型の変数を解釈するときは、右から左に移動する必要があります。例えば

int *x[]

は配列であることを示しますx。配列内の要素は、int *int へのポインターとして型指定されます。したがってx、要素が int ポインターである配列を表します。ただし、括弧は演算子の優先順位を変更します。*が最初に解釈さxれ、型が であるポインタであることを示しますint []。したがって、xinint (*x)[]は int 配列へのポインターであり、それに応じて初期化する必要があります。

于 2012-04-27T12:24:54.920 に答える
1

それがどのように作成されたかを知るまで、C のタイピングにも問題がありました。

C では、型は、その型の変数を使用する方法で記述されます。

したがって、次のように表示されます。

int *x;

これは、式*xが 型であることを意味し、 int へのポインター型の変数もint同様です。x

そして、あなたが見た場合:

int x[5];

x[3]これは、式が 型intであることを意味し、x配列の int 型の変数でもあります。

だから、あなたの式に到達するには:

int (*x)[];

これは、式*xが型(つまり、未知のサイズint[]の配列) であることを意味します。intしたがってx、int 配列へのポインター型の変数です。

于 2012-04-27T12:41:35.880 に答える
0

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を使用してから、実行時にメモリを割り当てます。

于 2012-04-27T12:58:04.440 に答える