我正在尝试学习如何以十进制和十六进制显示指针值。下面你可以看到我创建一个值并尝试使用指针打印出值和值的位置。
请使代码正常工作,以便打印出十进制和十六进制值
double val= 1;
printf("The value of val : %f\n",val);
double *ptr;
ptr= &val;
printf("dereference *ptr= %f\n", *ptr);
//Display the location of val with and without pointer use in decimal and hex
//decimal
printf("location of val in decimal with ptr is: %p\n",(void *) ptr);
printf("location of val in decimal without a pointer is: %p\n",(void *) &val );
//hexadecimal THIS IS NOT WORKING
printf("location of val in hex with ptr is: %#x\n", (void *) ptr);
printf("location of val in hex without a pointer is: %#x\n", (void *) &val );
答案 0 :(得分:5)
%p
格式采用void *
并以实现定义的格式打印。如果要抓住控制权,请使用<stdint.h>
中的类型和<inttypes.h>
的格式(首先在C99中定义):
#include <inttypes.h>
printf("Location in decimal: %" PRIuPTR "\n", (uintptr_t)ptr);
printf("Location in hex: 0x%.8" PRIXPTR "\n", (uintptr_t)ptr);
printf("Location in octal %#" PRIoPTR "\n", (uintptr_t)ptr);
等
uintptr_t
类型(名义上是可选的,但所有实际实现都应该定义它)是一个无符号整数类型,足以容纳指向对象的指针(变量;不一定足以容纳函数指针) )。诸如PRIuPTR
之类的名称定义了uintptr_t
类型的正确转换说明符(值是特定于平台的)。
请注意,如果您使用<inttypes.h>
,则不需要包含<stdint.h>
。
答案 1 :(得分:1)
C通常将内存地址作为十六进制数返回,因此您只需要使用%p。至于十进制表示,您可以使用类型转换:
int rand1 = 12, rand2 = 15;
printf("rand1 = %p : rand2 = %p\n\n", &rand1, &rand2);
// returns hexadecimal value of address
printf("rand1 = %d : rand2 = %d\n\n", (int) &rand1, (int) &rand2);
// returns decimal value of address
答案 2 :(得分:0)
不要忘记包含#include <inttypes.h>
。
根据评论的建议,最好这样做:
//hexadecimal
printf("Location in hex: 0x%.8" PRIXPTR "\n", (uintptr_t)ptr);
printf("Location in hex: 0x%.8" PRIXPTR "\n", (uintptr_t)&val);
如果你对unitptr_t
演员感到不舒服,那么想象你正在施展unsigned int
。它不一样,但它是一个开始的东西。
有关详情,请参阅this回答。
此外,您可能需要查看%p
和%x
之间的difference。
答案 3 :(得分:0)
对于十进制使用%lu(长无符号)而不是%p 此外,不需要使用普通printf函数进行(void *)转换
像这样:
//decimal
printf("location of val in decimal with ptr is: %lu\n",ptr);
printf("location of val in decimal without a pointer is: %lu\n",&val );
以十六进制格式打印指针时,可以使用%p而不是%x。 像这样:
//hexadecimal
printf("location of val in hex with ptr is: %#x\n", ptr);
printf("location of val in hex without a pointer is: %p\n", &val );