代码之家  ›  专栏  ›  技术社区  ›  Joe DF

char*var之间的差异;和char*var;?[副本]

  •  23
  • Joe DF  · 技术社区  · 13 年前

    只是想知道以下两者之间是否有区别:

    char* var;
    char *var;
    

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

    1 回复  |  直到 11 年前
        1
  •  53
  •   cdhowie    13 年前

    在这种情况下没有区别。然而,你应该更喜欢 char *var; .

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

    char* a, b;
    

    你拥有的是 a ,指向的指针- char b 烧焦 。这太令人困惑了!自 * 角色更接近 烧焦 关键字,我们希望这两个变量的类型都指向- 烧焦 ,但是 * 实际上是关联的 只有 具有 (这与 char a[10], b; 正如tepic在评论中指出的那样;这个 [10] 说明符同样只与关联 ,仅此而已 将是一个数组。)

    正确的声明是:

    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 *foo();
    

    程序员指的是一个函数吗?该函数返回一个指向- 烧焦 ,或者他是想创建一个指向返回的函数的指针 烧焦 ? 该语言会将其解析为与其他原型相同,但我们的目标是可读性,这意味着要准确地传达我们的意思 人类 ,而不仅仅是编译器。