【问题标题】:Whats the difference between void* and void * [duplicate]void* 和 void * 有什么区别 [重复]
【发布时间】:2012-07-16 06:10:34
【问题描述】:

可能重复:
In C, why is the asterisk before the variable name, rather than after the type?
Declaring pointers; asterisk on the left or right of the space between the type and name?

我用指针有一段时间了,用来声明指针之类的

int *x;

但是通过一些代码注意到,在某些情况下,* 似乎在数据类型之后,比如

void* setValue(){
 /*          */
}

有什么区别以及为什么要这样使用

【问题讨论】:

  • 请注意:编译器将输入流分解为标记,然后处理这些标记。并且空格不是任何标记的一部分(尽管它可以用于分隔标记),因此在这两种情况下解析器看到的标记序列是int*x;。不管是写int*x;int *x;int* x;还是int * x;(甚至int/*obfuscating*/*/*comment*/x;---cmets都算作空白)。
  • 完全没有区别。两者都使用。

标签: c++ pointers


【解决方案1】:

语义上没有。这就是风格。

将星号放在变量旁边的好处是可以防止这种常见错误:

char* str1, str2;
/* str2 is a char, not char* ! */

char *str1, *str2;
/* ok */

这个问题在返回类型中不存在,所以它在那里更不重要。

【讨论】:

    【解决方案2】:

    这与a+ba + b 的区别完全一样——也就是没有区别。空格没有任何意义,除非需要分隔标记。

    【讨论】:

    • 最后一个说法是不正确的,是的三字。
    【解决方案3】:

    没有区别,在某些情况下最好保持在右侧:

    int* p1,p2;
    

    看起来像 p1 和 p2 ara 指针,而只有 p1 是,

    int *p1,p2;
    

    现在看起来好多了,但好的样式是将其拆分为单独的行:

    int *p1;
    int p2;
    

    【讨论】:

      【解决方案4】:

      没有语义差异。

      通常建议在类型旁边保留*,因为x 的真实类型是void *。然而,这在语法上是错误的,因为 C/C++ 将星号绑定到变量名。

      int *x, y; // declare one pointer to int x and one int y
      

      我个人尝试将* 保持在中间

      int * x;
      

      【讨论】:

        【解决方案5】:

        指向void 的指针,记为void* 是一个通用的不透明指针。您可以传递它(作为参数、结果、通过变量、字段......)并比较它,但获取指向数据的唯一方法是适当地转换它。不适当的强制转换是未定义的行为,可能会使您的程序崩溃。

        * 之前或之后的空格表示类型中的指针,它是一种样式。空格并不重要,除了作为标记分隔符(* 本身就是一个标记)。

        我强烈建议与间距保持一致。你可以使用像例如这样的工具。 indent 缩进你的源代码(并将-T 选项传递给它有助于很好地缩进类型名称)。 GNU indent 工具正在对空格进行规范化,并且有许多选项可以调整其行为(您可以将它们放在.indent.pro 文件中)。对于 C++ 代码,请考虑使用 astyle 而不是 indent

        【讨论】:

        • 你可能想再读一遍这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 2017-12-05
        • 2012-08-09
        • 2011-04-25
        • 1970-01-01
        相关资源
        最近更新 更多