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