#include<stdio.h>
int main(){
int a;
printf("%un ",&a);
printf("%pn ",a);
printf("%pn ",&a);
printf("%fpn ",&a);
return 0;
}
我尝试了此代码,但我无法理解输出
4193177020
(nil)
0x7ffff9eecdbc
0.000000p
该组件在此中有什么段是什么部分?
显然您的a
变量是用0
初始化的。
-
%u
显示一个无符号整数,然后将存储地址作为参数传递 -
%p
通常显示指针的值,因此,在0的情况下,它显示为(nil)
-
%p
也这样做,但是您现在通过a
的地址,该地址显示在十六进制中。 -
%fp
是%f
(浮点格式)和文字p
。我很确定这会导致不确定的行为,因为printf期望浮动并通过整数(指针是长/整数值)。
我们从中学到什么?不要编写无义代码和不要将参数传递给printf式函数,除非您有一个格式的字符串,该字符串完全期望这些参数。
看来您正在阅读一些非常古老的书。段和偏移组合被用来解决16位应用中的内存,它们被称为"远指针",而不是仅包含偏移的"本地指针"(通常是从ds
寄存器中获取的段)。
与32位或64位应用程序相关。这些应用程序可与一个单一的虚拟内存块一起使用,该记忆不再细分为段。操作系统将虚拟内存的部分映射到物理内存,这是应用程序不再需要担心的东西。所有指针都是该虚拟内存空间内部的偏移(分别为32位或64位应用程序) - 单个数字。
至于您的printf
语句,唯一将指针实际上指向a
并将其打印为指针的语句是printf("%pn ",&a)
-其他答案指出的是其他答案。