我想详细解释使用%d
的{{1}}和%p
类型之间的区别。
另外
为什么printing pointer
返回十六进制?
%p
和%d
返回不同值时的情况是什么?
数据类型是否仅表示用户想要输出的方式,还是与内存位置有关?
答案 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的语法不允许你这样做(只是警告)。如果你知道自己想做什么,就可以做到。