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

c语言中%d和%p printf格式字符串指令之间的差异?,c,pointers,type-conversion,C,Pointers,Type Conversion,我想详细解释一下使用%d和%p类型进行打印指针之间的区别 也 为什么%p返回十六进制? 当%d和%p返回不同的值时,会出现什么情况? 数据类型是否仅表示用户希望输出的方式,还是与内存位置有关?这些转换高度依赖于体系结构。最明显的区别之一是实模式8086,其中int为16位,而(大型)指针为32位,但有一个段和偏移量,它们始终被写为段:偏移量 %d takes 16 bits and displays it as a signed value 123 %p takes a point

我想详细解释一下使用
%d
%p
类型进行
打印指针
之间的区别

也 为什么
%p
返回十六进制? 当
%d
%p
返回不同的值时,会出现什么情况?
数据类型是否仅表示用户希望输出的方式,还是与内存位置有关?

这些转换高度依赖于体系结构。最明显的区别之一是实模式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位地址来实现它。

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

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


输出指针的格式是特定于体系结构的(指针可以有不同的大小,甚至不同)。然而,用十六进制来转录内存地址是很常见的,所以这就是
%p
通常所做的。

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

错误的术语:
%p
%d
不是数据类型(比如
int
void*
),而是
printf
格式字符串指令。谢谢你指出这一点。..BTW,如果使用
gcc-Wall-g
编译,当误用这些格式字符串指令时,可能会收到警告(至少当格式字符串是
printf
的文本常量参数时)