There\'re a lot of questions on SO about details of pointer and array declarations in C (and C subset of C++).
I\'m more interested in why.
Why
Kernighan and Ritchie write, in The C Programming Language, 1978, page 90:
The declaration of the pointer
px
is new.
int *px;
is intended as a mnemonic; it says the combination
*px
is anint
, that is, ifpx
occurs in the context*px
, it is equivalent to a variable of the typeint
. In effect, the syntax of the declaration for a variable mimics the syntax of expressions in which the variable might appear. This reasoning is useful in all cases involving complicated declarations. For example,
double atof(), *dp;
says that in an expression
atof()
and*dp
have values of typedouble
.
Thus, we see that, in declarations such as int X, Y, Z
, X
, Y
, and Z
give us “pictures” of expressions, such as b
, *b
, b[10]
, *b[10]
, and so on. The actual type for the declared identifier is derived from the picture: Since *b[10]
is an int
, then b[10]
is a pointer to an int
, so b
is an array of 10 pointers to int
.
Why do we have to put *, [] in front of every variable when we declare several pointers/arrays in a row?
The answer would be: explicit is better than implicit. In such a case we can even declare different types on the same row, int *a, *b, c;
and so on, in another case it would be too messy. The same true for the second question.