2013-03-04 105 views
18

只是想知道是否有任何区别:char * var;和char * var;?

char* var; 
char *var; 

或者是它只是一个偏好(间距)的事?

+1

它们是等效的声明。 – ouah 2013-03-04 22:13:22

+3

http://stackoverflow.com/questions/398395/in-c-why-is-the-asterisk-before-the-variable-name-rather-than-after-the-type http://stackoverflow.com/问题/ 3770187 /差异-int-i-and-int-i – cnicutar 2013-03-04 22:13:39

+1

它只是一个优先选择的问题,char * x通常被使用 – 2013-03-04 22:14:45

回答

41

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

这是因为*与变量名称更密切相关,并且不是基本类型的一部分。例如,如果你这样做:

char* a, b; 

你有什么是a,指针-TO-charb,一个char。这很混乱!由于*性格更接近char关键字,我们预计类型的两个变量的将是指针,TO-char,但*实际上是相关a。 (这类似于char a[10], b;如在评论中指出由teppic;所述[10]说明符同样仅与a相关联,并且因此只有a将是一个数组。)

正确声明将是:

char *a, *b; 

*符靠近可变意味着它很容易地看到发生了什么事情,当你打算一个变量是指针,而另一个不是:

char *a, b; 

在这种情况下,显然b并不是一个指针。在原始示例(char* a, b;)中,我们不知道编程器是否打算将b作为指针。从道格拉斯克罗克福德借来的,我们所知道的只是程序员无能。

有些人喜欢之前和之后把一个空间*

char * a, * b; 

这猎物落在上面说明了同样的问题:如果b不是指针,则声明(char * a, b;)也可能导致关于程序员的意图的不确定性。因此,我建议不要在*和变量名称之间放置空格。

任何你看它的方式,char* var;应该被视为不好的风格。根据语言规范,它在语法上是正确的,但会导致无法读取的代码,因为它出现以指示*说明符是同一声明中所有变量共享的类型的一部分,如果不是。 (类似于在同一行上编写一个复杂的函数 - 它可行,但这不是一个好主意。有些情况下,可读性和可维护性取代了个人风格偏好,这就是其中之一。)


就个人而言,我更愿意把一个空间后*与函数的返回值打交道时:

char * foo(); 

这是明确的:那就是返回一个指针的函数 - 至 - char

char *foo(); 

难道程序员意味着返回一个指针-TO-char,还是他的意思是创建一个指向返回char功能的功能?该语言将解决此问题与其他原型相同,但我们的目标是可读性,而这意味着完全传达我们对人类的意义,而不仅仅是编译器。

+0

比较[]定义一个数组的关联也是有用的,而()定义一个函数。虽然这些遵循标识符,但与使用*定义指针的原理相同。 – teppic 2013-03-04 22:16:15

+0

@teppic好点,那些说明符也表现相同的方式。当您考虑这些时,'*'的行为会更有意义。 – cdhowie 2013-03-04 22:17:01

+1

我也喜欢'char * var'风格,因为在我看来它使'*'的语义更加一致。 'char * var'意味着'var'指向的* dereferenced *值的类型是'char',这是真的。 'char * var'看起来像将反引用运算符放在变量名“char”的错误一侧,这根本没有任何意义。 – 2013-03-04 22:19:16

5

没有什么区别,只是喜好的事情,你自己说的