我目前正在改进COM组件的一部分,将所有外部调用记录到文件中。对于指针,我们写(IInterface*)0x12345678
之类的值,其值等于实际地址。
目前,对于空指针没有区别 - 它们显示为0x0
,其中IMO不是最理想且不优雅。改变这种行为根本不是问题。但首先我想知道 - 在十六进制中表示空指针有什么真正的优势吗?
答案 0 :(得分:2)
在C或C ++中,您应该能够使用标准%p
格式代码,这样就可以使您的指针看起来像其他人一样。
我不确定%p
在Win32中如何格式化空指针,在Linux上我认为你得到“null”或类似的东西。
答案 1 :(得分:2)
使用符号0x0(IMO)可以更清楚地表明它是指一个地址(即使它不是空指针的内部表示)。 (在实际代码中,我更喜欢使用NULL
宏,但听起来好像你在谈论调试spew。)
它提供了一些上下文,就像我更喜欢使用'\0'
作为NUL终结符。
这是一种风格偏好,所以吸引你(以及你的同事)也是如此。
答案 2 :(得分:1)
最终都是正零。
答案 3 :(得分:1)
有:您可以随时将它们转换回数字(0),而无需额外的努力。唯一的缺点是可读性。
答案 4 :(得分:1)
没有理由更喜欢(SomeType *)0x0到(SomeType *)0。
顺便说一下:在C中,空指针常量是一个有点奇怪的结构;即使某些机器上的内部表示可能与数值0不同,编译器也会将(SomeType *)0识别为“空指针”。它更像是SQL中的NULL - 而不是“实际”指针值。实际上,我所知道的所有机器都将空指针建模为“0”地址。
答案 5 :(得分:1)
我很确定十六进制表示法是内存布局的结果。存储器是字对齐的,如果你在32位处理器上,那么一个字是32位。这些单词被分段为页面,这些页面排列在页面表格等中。等号表示法是理解这种安排的唯一方法(除非你真的喜欢使用你的计算器)。
答案 6 :(得分:1)
就个人而言,我将0x0
打印到日志文件[*]。有一天,当有人自动解析文件时,数据越均匀越好。我没有发现0x0
难以阅读,所以在编写器代码中有一个特殊情况,而在读者代码中有另一个特殊情况似乎很愚蠢,这是我无法想到的。
0x0
比0
更适合于为日志填充日志:保存你必须弄清楚你应该为)0
或其他有趣的事情进行掠夺。
但是,我不会在C或C ++中为空指针常量编写0x0
。我写的非空地址非常令人难以置信,因为空值无法统一。我想如果我定义了一堆常量来表示某个设备的内存映射,和零地址在该内存映射中是重要的,那么我可能会在该上下文中将其写为0x0
[*]或者0x00000000
。我喜欢打印8个字符长的32位指针,因为当我读取/记住指针时,我从左边开始成对出现。如果事实证明有7个字符,我最后会感到非常困惑;-)。 64位指针没关系,因为我记不起那个长的数字......
答案 7 :(得分:1)
我的观点是,为了便于阅读,请考虑一下,如果你要看0,那是什么意思,这是否意味着它是无符号整数,或者如果它是0x0,那么本能地,它与它有关二进制表示法,更可能取决于平台。
由于标签与语言无关,并且单词'空指针',在Delphi / Object Pascal中,它是'nil',在C#中,它是'null',在C / C ++中它是'NULL'。< / p>
请参阅C-FAQ中的示例,在Section 5中关于NULL指针,特别是5.4,5.5,5.6和5.7给出你了解这一点。
简而言之,空指针的用法和表示法取决于
希望这有帮助, 最好的祝福, 汤姆。