只是想知道之间是否有任何区别:
char* var;
char *var;
或者只是偏好(间距)?
答案 0 :(得分:45)
这种情况没有区别。但是,您应该更喜欢char *var;
。
这是因为*
与变量名称关联得更紧密,不属于基本类型。例如,如果您这样做:
char* a, b;
你拥有的是a
,指针指向char
和b
,char
。这令人困惑!由于*
字符更接近char
关键字,我们希望这两个变量的类型都是指向char
的指针,但*
实际上是关联的< em>仅 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
的函数的指针?该语言将解析它与其他原型相同,但我们的目标是可读性,这意味着准确地传达我们对人类的意思,而不仅仅是编译器。