由(void *)0引起的思考

最近准备了解下uC/OS II嵌入式实时操作系统,读代码的时候发现了程序中一个奇怪的的写法:(void *) 0。不明所以,便开始寻找答案。最后发现小小的void的竟隐藏着那么多东西。

一、void

void是空类型的意思,函数表示函数无返回值,或者无参数传递。比如void Delay10ms(void)。同时,void也不能这样定义变量,void p

二、void *p

然而,void *则表示无类型指针,也就是说void *可以指向任何类型的指针。比如:

这在VC++6.0编译是正确的。

编译是错误的,提示”cannot convert from ‘void *’ to ‘int *’”

所以可以把任何类型的指针赋值给无类型的,但是不可以把无类型的指针赋给有类型的。网上对于此的解释有一句话说的好:“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。

void是一个比较抽象的概念,所以不能利用无类型的指针获取指针所指向的数据。

程序输出的结果一样,都是变量b的地址。

运行正确,输出10。

然而

编译会出现错误。

把上面的程序中无类型指针强制转换成整型指针,则可以输出所指向地址内存中存储的值。

这样输出的结果为:10

三 void *p()

由上面可以推断

void *p()是定义一个返回值是无类型指针的函数(通用指针)

四、(void *) 0

所以,(void *) 0就是把0强制转化成无类型指针,它只能赋值给无类型指针,而不能赋值给有类型指针。

编译正确。

编译错误:“cannot convert from ‘void *’ to ‘int *’”

一般

NULL表示一个空指针。