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

时间:2014-10-02 05:57:59

标签: c pointers type-conversion

我想详细解释使用%d的{​​{1}}和%p类型之间的区别。

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

3 个答案:

答案 0 :(得分:11)

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

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

打印指针的格式是特定于体系结构的(指针可以具有不同的大小或实际上不同的structure)。但是,以十六进制转录内存地址是很常见的,因此%p通常会这样做。

答案 1 :(得分:1)

这些转换高度依赖于体系结构。其中一个最明显的区别是实模式8086,其中int是16位,而(大型模型)指针是32位,但有一个段和偏移量,总是写成段:偏移量。

%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位地址来实现它。

答案 2 :(得分:0)

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的语法不允许你这样做(只是警告)。如果你知道自己想做什么,就可以做到。