Why is the asterisk before the variable name, rather than after the type?
Solution 1:
They are EXACTLY equivalent. However, in
int *myVariable, myVariable2;
It seems obvious that myVariable has type int*, while myVariable2 has type int. In
int* myVariable, myVariable2;
it may seem obvious that both are of type int*, but that is not correct as myVariable2
has type int.
Therefore, the first programming style is more intuitive.
Solution 2:
If you look at it another way, *myVariable
is of type int
, which makes some sense.
Solution 3:
Something nobody has mentioned here so far is that this asterisk is actually the "dereference operator" in C.
*a = 10;
The line above doesn't mean I want to assign 10
to a
, it means I want to assign 10
to whatever memory location a
points to. And I have never seen anyone writing
* a = 10;
have you? So the dereference operator is pretty much always written without a space. This is probably to distinguish it from a multiplication broken across multiple lines:
x = a * b * c * d
* e * f * g;
Here *e
would be misleading, wouldn't it?
Okay, now what does the following line actually mean:
int *a;
Most people would say:
It means that a
is a pointer to an int
value.
This is technically correct, most people like to see/read it that way and that is the way how modern C standards would define it (note that language C itself predates all the ANSI and ISO standards). But it's not the only way to look at it. You can also read this line as follows:
The dereferenced value of a
is of type int
.
So in fact the asterisk in this declaration can also be seen as a dereference operator, which also explains its placement. And that a
is a pointer is not really declared at all, it's implicit by the fact, that the only thing you can actually dereference is a pointer.
The C standard only defines two meanings to the *
operator:
- indirection operator
- multiplication operator
And indirection is just a single meaning, there is no extra meaning for declaring a pointer, there is just indirection, which is what the dereference operation does, it performs an indirect access, so also within a statement like int *a;
this is an indirect access (*
means indirect access) and thus the second statement above is much closer to the standard than the first one is.
Solution 4:
Because the * in that line binds more closely to the variable than to the type:
int* varA, varB; // This is misleading
As @Lundin points out below, const adds even more subtleties to think about. You can entirely sidestep this by declaring one variable per line, which is never ambiguous:
int* varA;
int varB;
The balance between clear code and concise code is hard to strike — a dozen redundant lines of int a;
isn't good either. Still, I default to one declaration per line and worry about combining code later.