void和void有什么区别

Whats the difference between void* and void *

本文关键字:void 区别 什么      更新时间:2023-10-16

可能重复:
在C中,为什么星号在变量名之前,而不是在类型之后
声明指针;星号在类型和名称之间的空格的左边还是右边?

我已经使用指针有一段时间了,并且曾经声明像这样的指针

int *x;

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

void* setValue(){
 /*          */
}

区别是什么以及为什么像一样使用

语义上什么都没有。这就是风格。

将星号放在变量旁边的优点是防止了这种常见的错误:

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

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

这与a+ba + b之间的区别完全相同,即没有区别。空白区没有任何意义,除非它需要分离令牌。

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

int* p1,p2;

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

int *p1,p2;

现在它看起来更好了一点,但好的风格是将它拆分为单独的行:

int *p1;
int p2;

没有语义差异。

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

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

就我个人而言,我尽量将*保持在中间

int * x;

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

至于表示类型中指针的*之前或之后的空间,这是一种风格。除了作为标记分隔符(*本身就是一个标记)之外,空格实际上并不重要。

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