This issue has always bothered me a bit too. D from Digital Mars "fixes" this issue. However, separating the * from the type declaration
does offer some flexibility.
int a, *b = NULL, *c, d = 0; // a is int, b is int pointer, c is int pointer, d is int.float* e, f; // Whoops! f looks like it would be a pointer, but it's not!
All on one line, pointers and non-pointers (of the same type) can be declared (and initialized). This can be sorta nice, but the second line illustrates a simple pitfall; both e and f kinda look like they should be pointers. When I first learned C/C++, I thought they were. Now I know better. :-)
In all of my code, I "pair" the * with the type and pretend C++ honors that (except, of course, when I can't, perhaps when doing something like the above code with the ints). I usually do this:
void foo(int* bar) { ... }
The rational behind why C/C++ works this way, I have no idea.