以下の宣言の違いは何ですか?
char *argv[];
と
char *(argv[]);
スパイラルルールでも同じだと思います。
以下の宣言の違いは何ですか?
char *argv[];
と
char *(argv[]);
スパイラルルールでも同じだと思います。
書かれているように、括弧は違いはありません。
いわゆるスパイラル ルールは、C 文法のこの単純な事実から外れています。 and などの後置演算子は、 など()
の[]
単項演算子よりも優先順位が高いため、 and*
のような式は*f()
and*a[]
として解析され*(f())
ます*(a[])
。
したがって、次のような比較的複雑な式が与えられた場合
*(*(*foo)())[N]
それは次のように解析します
foo -- foo
(*foo) -- is a pointer (parens force grouping)
(*foo)() -- to a function
(*(*foo)()) -- returning a pointer (parens force grouping again)
(*(*foo)())[N] -- to an array
*(*(*foo)())[N] -- of pointer
はい、同じです。char *(argv[])
まだポインターの配列を意味します。
char (*argv)[]
の配列へのポインターを意味するため、異なりchar
ます。
argv[]
は型では(argv[])
ないため、関数宣言にすることはできません。これは優先操作です。[]
(優先順位の有無にかかわらず) を見つけ、次に*
を見つけます*argv[]
。