Why is the asterisk before the variable name, rather than after the type?
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.
If you look at it another way, *myVariable
is of type int
, which makes some sense.
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.