我想做一些看似相当简单的事情。我得到了结果,但问题是,我无法知道结果是否正确。
我在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;
答案 0 :(得分:38)
在指向指针的地址中打印地址:
printf("%p",emp1)
取消引用一次并打印第二个地址:
printf("%p",*emp1)
您始终可以使用调试器进行验证,如果您使用的是ddd
并显示内存,或只是gdb
,您将看到内存地址,以便与指针中的值进行比较
答案 1 :(得分:28)
你拥有的是正确的。当然,你会看到emp1和item1具有相同的指针值。
答案 2 :(得分:14)
我相信这是最正确的。
printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);
printf()
是一个可变函数,必须传递正确类型的参数。标准说%p
需要void *
。
答案 3 :(得分:9)
既然你似乎已经解决了基本的指针地址显示,那么你将如何检查双指针的地址:
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);
答案 4 :(得分:4)
char c = 'A';
printf("ptr: %p,\t value: %c,\t and also address: %zu",&c, c,&c);
结果:
ptr:0xbfb4027f,值:A,地址:3216245375
答案 5 :(得分:0)
我一直在这个位置,尤其是新硬件。我建议你自己编写一个小的十六进制转储程序。您将能够一起显示数据及其所在的地址。这是一个很好的做法和一个信心建设者。