3

違いは何ですか

char *array[10];

char (*array)[10];?

私の理解では、

  • ケース 1:
    • arrayサイズ 10 の文字配列の配列として宣言されています。
    • []よりも優先順位が高いためです*
  • ケース 2:
    • arrayサイズ 10 の文字配列へのポインターとして宣言されます。
    • これは、()[]が同じ優先順位を持ち、左から右に評価されるためです。次に、*演算子が評価されます。

私の理解は正しいですか?たとえそれが正しいとしても、私は信じられないほど混乱します。誰かが違いをもう少し明確に説明できますか?

4

5 に答える 5

9

C の型を解釈しようとするときは、[...] (または [...][...]... のグループ) を左側のものに切り替えてから、右から左に読みます。したがって

char *array[10] -> char *[10]array =

"arrayは char への 10 個のポインターの配列です"

char (*array)[10] -> char [10](*array)

"arrayは 10 文字の配列へのポインタです"

したがって、最初のケースでarrayは 10 個の連続したポインターがあり、それぞれが 1 つの char (単一の char または文字列などの一連の char の場合もある) を指しますが、2 番目のケースでarrayは単一のポインターであり、 10 個の連続した文字の配列。

関数型で同様のことを行うことができ、左側のものでパラメーター リストを切り替えます。例えば、

char* (*f[10])(int*) -> char* (int*)(*[10]f)

" fint 引数へのポインターを取り、char へのポインターを返す関数への 10 個のポインターの配列です"。

于 2013-04-01T05:44:23.170 に答える
3

最初のものは、おそらく文字ポインターの配列と呼ぶほうが適切です。

複雑なポインター定義の読み取りは、一種のトリックを認識することで簡単に行うことができます。私はこの記事を読んで、私を大いに助けてくれました。見た目も素敵なのがもう一つ。

于 2013-04-01T05:31:15.503 に答える
1

最初のケースarrayでは、char への 10 個のポインターの配列です (それが のような関数パラメーターでない場合) void some_function(char* array[10])。関数パラメーターの場合は、char へのポインターへのポインターです。

2 番目のケースでは、宣言が無効です。ここでコンパイルエラーを参照してください。

2 番目のケースarrayは、10 文字の配列へのポインタです。

于 2013-04-01T05:29:49.047 に答える
1

char *array[10]; 10 個の char ポインターの配列です。

例:

char *array[10] = {"Hello", "Hai"};

where as char (*配列)[10]; 10文字の配列へのポインタです。

2 つ目は、 char arr[10]を指すことができます。


配列 = &arr;

配列への C ポインター/ポインターの配列のあいまいさの解消

于 2013-04-01T05:30:47.697 に答える