char * var之间的区别;和char * var;?

时间:2013-03-04 22:12:02

标签: c pointers ansi-c

只是想知道之间是否有任何区别:

char* var;
char *var;

或者只是偏好(间距)?

1 个答案:

答案 0 :(得分:45)

这种情况没有区别。但是,您应该更喜欢char *var;

这是因为*与变量名称关联得更紧密,不属于基本类型。例如,如果您这样做:

char* a, b;

你拥有的是a,指针指向charbchar。这令人困惑!由于*字符更接近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的函数的指针?该语言将解析它与其他原型相同,但我们的目标是可读性,这意味着准确地传达我们对人类的意思,而不仅仅是编译器。