C指针位置,十进制和十六进制

时间:2014-09-26 00:20:31

标签: c pointers hex decimal

我正在尝试学习如何以十进制和十六进制显示指针值。下面你可以看到我创建一个值并尝试使用指针打印出值和值的位置。

请使代码正常工作,以便打印出十进制和十六进制值

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 ); 

4 个答案:

答案 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 );