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

Joe*_* DF 21 c pointers ansi-c

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

char* var;
char *var;
Run Code Online (Sandbox Code Playgroud)

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

cdh*_*wie 46

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

这是因为*它与变量名称关联得更紧密,并且不是基本类型的一部分.例如,如果您这样做:

char* a, b;
Run Code Online (Sandbox Code Playgroud)

你有什么a,指针-TO- char,并且b,一char.这令人困惑!由于*字符更接近char关键字,我们期望两个变量的类型都是指向char,但*实际上a.(这类似于char a[10], b;注释中teppic所指出的;说明[10]符同样只与数组关联a,因此只是a一个数组.)

正确的声明是:

char *a, *b;
Run Code Online (Sandbox Code Playgroud)

使*说明符更接近变量意味着当您打算将一个变量作为指针而另一个变量不是指针时,很容易看到发生了什么:

char *a, b;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,显然b不是指针.在原始示例(char* a, b;)中,我们不知道程序员是否打算b成为指针.借用Douglas Crockford,我们所知道的是程序员不称职.

有些人喜欢在前后放置一个空格*:

char * a, * b;
Run Code Online (Sandbox Code Playgroud)

这成为上面说明的同样问题的牺牲品:如果b不是指针,那么decla(char * a, b;)也可能导致程序员意图的不确定性.因此,我建议不要*在变量名1和变量名1之间放置一个空格.

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


1个人而言,我更喜欢把一个空间后,* 用函数的返回值打交道时:

char * foo();
Run Code Online (Sandbox Code Playgroud)

这是明确的:它是一个返回指针的函数char.

char *foo();
Run Code Online (Sandbox Code Playgroud)

程序员是否意味着一个返回指针的函数char,或者他是否意味着创建一个返回函数的指针char?该语言将解决此问题与其他原型相同,但我们的目标是可读性,这意味着准确地传达我们对人类的意义,而不仅仅是编译器.

  • 我也喜欢`char*var`风格,因为在我看来它使`*`的语义更加一致.`char*var`意味着`var`指向的*dereferenced*值的类型是`char`,这是真的.`char*var`看起来像是将dereference操作符放在变量名`char`的错误一侧,这根本没有任何意义. (2认同)
  • 如果可以的话,+1以上 - 你很好地解决了所有问题. (2认同)