繁体   English   中英

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

[英]C Pointer Location, Decimal and Hexadecimal

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

请使代码正常工作,以便以十进制和十六进制格式输出值

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

%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>

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

不要忘记包含#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 并不一样,但这是一个开始。

有关更多信息,请阅读答案。

另外,您可能想看看%p%x之间的区别

对于十进制,请使用%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 ); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM