在C中打印地址或指针以获取值


80

我想做一些看起来很简单的事情。我得到结果,但是问题是,我无法知道结果是否正确。

我在C语言中工作,有两个指针。我想打印指针的内容。我不想取消引用指针以获取指向的值,我只想要指针已存储的地址。

我编写了以下代码,我需要知道的是,是否正确,如何更正。

在我发布此内容时(以及正确的原因很重要)是,我最终需要针对指针到指针进行此操作。那是:


您写的是正确的,您究竟遇到什么问题?
卡·马太斯

正如我所描述的,我正在获得结果,但无法知道结果是否正确或是否给我带来垃圾。Don和下面的其他人(以及您自己)确认这些结果有效。
Frank V

Answers:


29

你所拥有的是正确的。当然,您会看到emp1和item1具有相同的指针值。


1
如果item1的类型是多重继承的一部分和/或是Emp的祖先,则它们将是不同的,具体取决于编译器对构成item1的类型的每个类的布局方式。
Jim Buck 2009年

2
@Jim:“ C”标记表示其他
含义

1
@Jim:Hasturkun是正确的。我正在C中工作。
Frank V

39

在指针中打印地址:

取消引用一次并打印第二个地址:

您始终可以通过调试器进行验证,如果您在Linux上使用ddd并显示内存,或者只是显示gdb,则将看到内存地址,以便可以与指针中的值进行比较。


16

我相信这将是最正确的。

printf()是可变参数函数,必须传递正确类型的参数。该标准说%p需要void *


我以为他们会升职吗?不确定,有人可以澄清吗?
RastaJedi '16

4
经过研究,不,它们不会自动升级。到铸件void *确实是必需的。
RastaJedi '16

10

由于您似乎已经解决了基本指针地址的显示问题,因此下面是检查双指针地址的方法:

您可以a通过执行以下操作访问双指针的地址:


printf("which contains this value: %c\n" **a);只是想添加^。^。
RastaJedi's

4

结果:

ptr:0xbfb4027f,值:A,以及地址:3216245375


0

我一直在这个职位上,特别是在使用新硬件时。我建议您编写一些自己的十六进制转储例程。您将能够一起查看数据以及它们所在的地址。这是一个好习惯,并且可以建立信心。


3
以听起来无知为代价-您能详细说明一下如何编写这样的例程吗?
Faisal Vali

1
另外,这个答案可能更适合作为评论?
RastaJedi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.