Just wondering if there's any difference between:
char* var; char *var;
or is it just a matter of preference (spacing)?
char *var implies that the type of the dereferenced value pointed at by var is char , which is true. char* var looks like you put the dereference operator on the wrong side of the variable-name char , which doesn't make any sense at all.
The main difference between them is that the first is an array and the other one is a pointer. The array owns its contents, which happen to be a copy of "Test" , while the pointer simply refers to the contents of the string (which in this case is immutable). Why is char* str commonly used when str denotes a string.
There is no difference in this case. However, you should prefer char *var;
.
This is because the *
is associated more closely with the variable name and is not part of the base type. For example, if you do this:
char* a, b;
What you have is a
, a pointer-to-char
, and b
, a char
. This is confusing! Since the *
character is closer to the char
keyword, we expect that the types of both variables will be pointer-to-char
, but the *
is actually associated only with a
. (This is similar to char a[10], b;
as pointed out by teppic in the comments; the [10]
specifier is likewise only associated with a
, and so only a
will be an array.)
The correct declaration would be:
char *a, *b;
Putting the *
specifier closer to the variable means that it's easy to see what's going on when you intend for one variable to be a pointer and the other not:
char *a, b;
In this case it's obvious that b
was not intended to be a pointer. In the original example (char* a, b;
), we don't know whether or not the programmer intended for b
to be a pointer. To borrow from Douglas Crockford, all we know is that the programmer is incompetent.
Some people like to put a space before and after the *
:
char * a, * b;
This falls prey to the same problem illustrated above: if b
is not a pointer then the declaration (char * a, b;
) may also lead to uncertainty about the programmer's intent. Therefore I suggest not placing a space between the *
and the variable name1.
Any way you look at it, char* var;
should be treated as bad style. It's grammatically correct according to the language specification, but leads to unreadable code because it appears to indicate that the *
specifier is part of the type shared by all variables in the same declaration, when it is not. (It's akin to writing a complex function all on the same line -- it works, but it's a bad idea. There are cases where readability and maintainability supersede personal stylistic preferences, and this is one of them.)
1Personally, I prefer to put a space after the *
only when dealing with function return values:
char * foo();
This is unambiguous: it's a function that returns a pointer-to-char
.
char *foo();
Did the programmer mean a function that returns a pointer-to-char
, or did he mean to create a pointer to a function that returns char
? The language will resolve this as identical to the other prototype, but our goal is readability, and that means conveying exactly what we mean to humans, not just the compiler.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With