Wikipedia claims that the []
operator precedes the *
operator in evaluation.
Then, why does the following statement:
char *a[3];
declare an array of 3 character pointers, rather than a pointer to an 开发者_C百科array of 3 characters as per the operator precedence?
Because, as Wikipedia says, []
has higher precedence than *
?
Processing the declaration, the a[3]
is processed as 'array of 3' before you process the *
.
To declare a pointer to an array of three characters, you have to use parentheses to override the default precedence:
char (*a)[3];
Now the parentheses take precedence over the array.
Here's the grammar for a declarator as taken from the standard (§ 6.7.5):
declarator: pointeropt direct-declarator direct-declarator: identifier(
declarator)
direct-declarator[
type-qualifier-listopt assignment-expressionopt]
direct-declarator[ static
type-qualifier-listopt assignment-expression]
direct-declarator[
type-qualifier-liststatic
assignment-expression]
direct-declarator[
type-qualifier-listopt* ]
direct-declarator(
parameter-type-list)
direct-declarator(
identifier-listopt)
pointer:*
type-qualifier-listopt*
type-qualifier-listopt pointer type-qualifier-list: type-qualifier type-qualifier-list type-qualifier parameter-type-list: parameter-list parameter-list, ...
parameter-list: parameter-declaration parameter-list,
parameter-declaration parameter-declaration: declaration-specifiers declarator declaration-specifiers abstract-declaratoropt identifier-list: identifier identifier-list,
identifier
As you can see, both []
and ()
bind to the declarator before *
. Take the declaration
int *a[N];
The declarator is *a[N]
, which fits the pointeropt direct-declarator pattern above, and is thus parsed as *(a[N])
, so a
is an N-element array of pointer.
To sum up:
T *a[N] -- declares an N-element array of pointer to T
T (*a)[N] -- declares a pointer to an N-element array of T
T *f() -- declares a function returning pointer to T
T (*f)() -- declares a pointer to a function returning T
I'm confused about the question - the interpretation of the declaration matches the operator precedence. If you want a pointer to an an array you have to use parens to 'bind the *
to the indentifier' before the []
binding.
char (*a)[3];
精彩评论