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.