这是什么意思:(void *) 0x00

4

你知道这是什么意思吗?不确定是哪种语言。

(void *) 0x00

这段代码表示一个指针,指向内存地址为0x00的空间,其中“void *”代表未定义类型的指针。
6个回答

8
在C语言中,它代表一个空指针,即指向没有相关数据的指针。尝试访问这个数据会在Unix/Linux上引发一个分段错误(Segmentation Fault)。

2
...而且分段错误也是特定于平台的,不一定在所有环境中都会出现。 - Jason S
这是我在某人的脖子上看到的纹身。我猜是某种虚无主义的评论。谢谢。 - Todd Holmberg
2
@Jason:(void *) 0 不一定指向地址0。在指针上下文中使用 0(或 0x00)会产生空指针。对应于空指针的物理地址是实现定义的。例如,它可以是 0xFFFFAAAA。如果在某些微控制器上地址0是可访问和可用的,则该平台上的编译器应将 (void *) 0 转换为其他物理地址。 - AnT stands with Russia
你的意思是编译器是否符合ANSI C标准。我见过的大多数微控制器编译器都是ANSI C,但有一些例外情况需要处理中断等问题...如果我们很幸运,编译器制造商会记录非ANSI行为。 - Jason S
1
许多嵌入式控制器在0x0处都有一个跳转指令,因此它可以是一个有效的地址。然而,大多数情况下,这个值被用来表示一个指向空的指针。 - Thomas Matthews
显示剩余3条评论

3
#ifndef NULL
#   define NULL ((void *) 0)
#endif

那么你就可以在不同的函数中使用NULL!


啊哈,作为一个所有类型兼容的函数参数。真棒!! - rlb.usa

1

看起来像C语言,它表示指向内存位置0的指针。("void *" 表示指向原始内存的指针,并提示编译器/程序员该类型未知或未指定)

澄清一下:它是一个包含值0的指针,在大多数平台上,这个特殊值被称为NULL,表示无效/未初始化的指针,对其进行解引用会导致异常。在某些平台上(例如一些微控制器),内存位置0是一个有效的指针值。


1
?! (void *)(x-x) 怎么会产生一个与 (void *)0 不同的值? - Jason S
1
@Jason S:为了进一步解释Neil的答案,因为标准对于0(或0x00)有明确规定,但对于非常量表达式没有任何规定。这在标准中是一个任意的事情。 - David Thornley
2
一个具有值为0的整数常量表达式,或将这样的表达式强制转换为类型 void *,称为空指针常量。如果将空指针常量转换为指针类型,则得到的指针称为空指针,并保证与任何对象或函数的指针比较不相等。 - John Bode
@Jason S:你似乎对赋值为0的指针和所有位都为0的指针之间的区别感到困惑。在程序中,通过将0赋值给指针来指定一个空指针。在执行过程中,空指针的值可能是任何值,但通常是所有位都为0。(可以说,像Pascal的“nil”或C++0x的“nullptr”这样的指定方式会节省很多混淆。) - David Thornley
1
如果p是一个空指针,则!p将始终评估为true,无论平台使用哪个位模式表示空指针。从源代码的角度来看,空指针总是由0表示。如果实际的空指针值不是所有位都为0,则由实现映射!p!=actual null pointer value - John Bode
显示剩余11条评论

1

我记得这是一个 C/C++ 的空指针 :)


1

强制类型转换建议使用C或C++。这是将整数零强制转换为指针类型,这意味着它是空指针。这是在C中定义空指针的标准方式(除了更常用的(void *)0),但在C++中它是特定类型的空指针值。


据我所知,在C++中,将空指针转换为void类型是错误的。如果尝试这样做,我相信会导致一些编译错误。这表明OP使用的语言是C。 - rmeador
在C语言中,我喜欢使用NULL来表示空指针常量;如果我没有包含任何定义NULL的标准头文件,那么一个简单的0也可以胜任(我宁愿使用0而不是仅为了NULL#include <stddef.h>)。 - pmg
在C和C++中,(void *)0是一个空指针,类型为void *。在C中,这是一个有用的void指针,因为任何数据指针类型都可以自由地使用void *类型,转换是自动的。在C++中,由于其更严格的类型,这种方法不起作用,转换必须是显式的。在C中,int * ptr = (void *)0;是合法的,int * ptr = 0;也是合法的,两者意思相同。在C++中,只有第二个是合法的。 - David Thornley

0
奇怪的C符号。如果我猜的话,我会说这个人正在尝试在某些平台上将二进制0强制转换为指针,而在该平台上NULL不是二进制0。

3
根据 ANSI 标准,保证 NULL 的值为 0。(这是一个非常普遍的误解,认为 NULL 可能不是零) - Earlz
2
空指针常量保证为0(即,在指针上下文中的0始终被解释为为空指针,而NULL宏应该展开为0或(void *) 0)。 空指针(底层平台用于表示“无处”的位模式)可能是所有位都为0,也可能是其他值。 实现处理将空指针常量(0)映射到空指针(可能为0,也可能是其他值)。 - John Bode
@earlz:流行的误解是所有编译器都遵循ANSI标准 :) (尽管我们可以合理地假设他们这样做,然后去打违反规则的编译器团队):) - Ether
从其他评论中得知,如果空指针常量不是0,则像!p这样的表达式在各个平台上的行为将不会统一。如果编译器不符合此规范,则它要么非常有问题,要么与特定架构非常紧密耦合。 - John Bode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接