char* var; 和 char *var; 有什么区别?

23

想知道这两者之间有什么区别:

char* var;
char *var;

还是只是个人偏好(间距)的问题?


2
它们是等价的声明。 - ouah
3
在C++中,为什么指针变量名的前面要加星号而不是在类型后面?int i和int *i之间有什么区别? - cnicutar
2
这只是个人偏好问题,char *x 经常被使用。 - David Ranieri
1个回答

53
在这种情况下没有区别。然而,你应该优先选择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;

这也遇到了上面所示的同样问题:如果b不是指针,那么声明(char * a, b;)也可能导致对程序员意图的不确定性。因此,我建议在*和变量名之间不要加空格1
无论如何,char* var;都应该被视为糟糕的风格。它在语言规范上语法正确,但会导致代码难以阅读,因为它看起来表明*限定符是所有变量在同一声明中共享类型的一部分,而实际上并不是这样。(这类似于在同一行上编写复杂函数——它可以工作,但这是一个坏主意。在可读性和可维护性超过个人风格偏好的情况下,这是其中之一。)

1个人而言,我更喜欢在处理函数返回值时在*后面加一个空格仅此而已

char * foo();

这是明确的:它是一个返回指向char的指针的函数。
char *foo();

程序员是想要返回指向char的指针的函数,还是想要创建一个返回char的函数指针?语言会将这两个原型视为相同,但我们的目标是可读性,这意味着传达给人类确切的意思,而不仅仅是编译器。

将[]定义数组与()定义函数进行比较也很有用。虽然它们遵循标识符,但这与使用*定义指针的原理相同。 - teppic
@teppic 不错,这些限定符也有相同的行为。当你考虑到它们时,“*”的行为就更有意义了。 - cdhowie
2
我也喜欢 char *var 的风格,因为在我看来它使得 * 的语义更加一致。char *var 暗示了 var 所指向的 解引用 值的类型是 char,这是正确的。而 char* var 看起来就像你把解引用运算符放在了变量名 char 的错误一侧,这根本没有任何意义。 - Kyle Strand
我完全同意“正确”的方式,我在我的K&R C书中也看到它以相同的方式使用..谢谢你的帮助!:D - Joe DF
2
如果可以的话,我会给你加上一分或更多——你把所有问题都讲得非常好。 - R.. GitHub STOP HELPING ICE
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接