在C中打印值的地址或指针

Fra*_*k V 77 c pointers memory-address

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

我在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 );
Run Code Online (Sandbox Code Playgroud)

虽然我发布这个(以及重要的是它是正确的)是我最终需要这样做一个指针到指针.那是:

const Emp** emp1 = (const Emp**) item1; 
Run Code Online (Sandbox Code Playgroud)

ste*_*anB 38

要在指针指针中打印地址:

printf("%p",emp1)
Run Code Online (Sandbox Code Playgroud)

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

printf("%p",*emp1)
Run Code Online (Sandbox Code Playgroud)

您可以随时使用调试器进行验证,如果您使用的是Linux ddd并且显示内存,或者只是简单gdb,您将看到内存地址,以便您可以与指针中的值进行比较.


Don*_*eld 29

你有什么是正确的.当然,你会看到emp1和item1具有相同的指针值.

  • @Jim:"C"标签另有说明 (2认同)

sig*_*ice 14

我相信这是最正确的.

printf("%p", (void *)emp1);
printf("%p", (void *)*emp1);
Run Code Online (Sandbox Code Playgroud)

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

  • 经过一些研究,不,它们不会自动升级.确实需要强制转换为`void*`. (2认同)

Luc*_*eis 9

既然你似乎已经解决了基本的指针地址显示,那么你将如何检查双指针的地址:

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

b = &c;
a = &b;
Run Code Online (Sandbox Code Playgroud)

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

printf("a points at this memory location: %p", a);
printf("which points at this other memory location: %p", *a);
Run Code Online (Sandbox Code Playgroud)


4pi*_*ie0 5

char c = 'A';
printf("ptr: %p,\tvalue: %c,\tand also address: %zu", &c, c, &c);
Run Code Online (Sandbox Code Playgroud)

结果:

ptr: 0x7ffc48e5105f,    value: A,    and also address: 140721531457631
Run Code Online (Sandbox Code Playgroud)