想知道这两者之间有什么区别:
char* var;
char *var;
还是只是个人偏好(间距)的问题?
char *var;
。*
与变量名的关联更加紧密,并且*
不是基本类型的一部分。例如,如果你这样做:char* a, b;
a
和一个char
类型的变量b
。这很令人困惑!由于*
字符更靠近char
关键字,我们期望两个变量的类型都是指向char
类型的指针,但是*
实际上只与a
相关联。(正如评论中teppic所指出的char a[10], b;
一样;[10]
说明符也只与a
相关联,因此只有a
将成为数组。)
正确的声明应该是:
char *a, *b;
*
说明符靠近变量意味着当您打算让一个变量成为指针而另一个变量不是时,很容易看出发生了什么:char *a, b;
b
不是指针。在原始的例子中(char* a, b;
),我们不知道程序员是否有意让b
成为指针。借用Douglas Crockford的话,我们只知道程序员是不称职的。*
前后加空格:char * a, * b;
char * a, b;
)也可能导致对程序员意图的不确定性。因此,我建议在*
和变量名之间不要加空格1。char* var;
都应该被视为糟糕的风格。它在语言规范上语法正确,但会导致代码难以阅读,因为它看起来表明*
限定符是所有变量在同一声明中共享类型的一部分,而实际上并不是这样。(这类似于在同一行上编写复杂函数——它可以工作,但这是一个坏主意。在可读性和可维护性超过个人风格偏好的情况下,这是其中之一。)
1个人而言,我更喜欢在处理函数返回值时在*
后面加一个空格仅此而已:
char * foo();
char
的指针的函数。char *foo();
char
的指针的函数,还是想要创建一个返回char
的函数指针?语言会将这两个原型视为相同,但我们的目标是可读性,这意味着传达给人类确切的意思,而不仅仅是编译器。char *var
的风格,因为在我看来它使得 *
的语义更加一致。char *var
暗示了 var
所指向的 解引用 值的类型是 char
,这是正确的。而 char* var
看起来就像你把解引用运算符放在了变量名 char
的错误一侧,这根本没有任何意义。 - Kyle Strand