80

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

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

我编写了以下代码,我需要知道它是否正确,如果不正确,我该如何纠正它。

/* item one is a parameter and it comes in as: const void* item1   */
const Emp* emp1 = (const Emp*) item1; 

printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );

虽然我发布这个(以及它正确的原因很重要)是我最终需要为指向指针的指针执行此操作。那是:

const Emp** emp1 = (const Emp**) item1; 
4

6 回答 6

40

在指向指针的指针中打印地址:

printf("%p",emp1)

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

printf("%p",*emp1)

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

于 2009-06-28T22:53:28.333 回答
29

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

于 2009-06-28T22:53:17.180 回答
16

我相信这是最正确的。

printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);

printf()是一个可变参数函数,必须传递正确类型的参数。标准说%p拿来void *

于 2009-06-29T01:19:31.580 回答
10

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

char **a;
char *b;
char c = 'H';

b = &c;
a = &b;

您可以通过以下方式访问双指针的地址a

printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
于 2009-06-28T23:01:59.407 回答
5
char c = 'A';
printf("ptr: %p,\tvalue: %c,\tand also address: %zu", &c, c, &c);

结果:

ptr: 0x7ffc48e5105f,    value: A,    and also address: 140721531457631
于 2013-03-11T11:48:45.393 回答
0

我一直处于这个位置,尤其是在新硬件方面。我建议你自己编写一个小十六进制转储例程。您将能够看到一起显示的数据和它们所在的地址。这是一种很好的做法,也是建立信心的人。

于 2009-06-29T03:18:07.690 回答