c语言中%d和%p printf格式字符串指令之间的区别?

我想详细解释使用%d%p类型来printing pointer之间的区别。

另外为什么%p返回hex? 当%d%p返回不同的值时会出现什么情况? 数据类型是否仅表示用户想要输出的方式,还是与内存位置有关?

要使程序定义明确,格式说明符必须与参数的类型匹配。 因此,您可以使用%p而不是%d来打印指针。 (后者可能恰好适用于某些体系结构,但在技术上是未定义的行为 。)

您无法自由交换%d%p主要原因是ints和指针不必具有相同的大小。

打印指针的格式是特定于体系结构的(指针可以具有不同的大小或实际上不同的结构 )。 但是,以hex转录内存地址是很常见的,所以这就是%p通常所做的事情。

这些转换具有高度的架构依赖性。 最明显的区别之一是实模式8086,其中int是16位,(大型模型)指针是32位但是具有段和偏移量,它们总是写为segment:offset。

 %d takes 16 bits and displays it as a signed value 123 %p takes a pointer and display it in address format 0fef:0004 

由于%p是最近才引入的,我不知道任何实现,但是PDP-11库应该通过以八进制显示16位地址来实现它。

C中变量的指针与其他类型的变量(如int,char等)一样具有值。 printf函数中的%p格式字符串仅表示参数“i”的类型是指向printf而不是int的指针。 因此printf输出参数i的Hex值,因为printf将参数i看作指针类型。 无论变量i的类型是什么,值都相同—- 10或0xa。 i — int或指针—-的类型之间的区别是在C中使用的不同方式。如果i的类型被视为指针,则可以访问指针i指定的内存或其他操作指针类型支持。 如果i的类型是int,我们可以执行一些操作,例如加法或减法,而不是使用i的值来访问内存,因为C的语法不允许你这样做(只是警告)。 如果你知道自己想做什么,就可以做到。