[英]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
对于十进制,请使用%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.