我刚看到printf
的签名。它是int printf(const *f)
。现在,如果我宣布int i
并执行以下操作:
int i=5;
printf("%d",i);
它会显示i
的正确值。我想知道为什么会这样。由于printf
接受指针,因此它不应将i
的值视为地址并打印存储在该地址的值。
请注意,printf("%d", &i)
不起作用。
答案 0 :(得分:4)
printf()
是variadic function。这意味着它的第一个参数指示要从堆栈中提取的剩余参数的数量和类型。
第一个参数 - 也是唯一一个不受函数变量影响的参数 - 是一个字符串,因此是一个指针(如果重要的话,指向char
数组) 。其余参数的处理方式不同,并且未在您提到的简单原型中列出。
顺便说一句,这是从printf()
标题中提取的stdio.h
的完整原型:
extern int printf (const char *format, ...);
答案 1 :(得分:1)
第一个参数是格式字符串。将字符串传递给函数时,实际上是传递指针。
(此外,签名实际上是int printf(const char *, ...)
。)
答案 2 :(得分:0)
printf(3)
是variadic function。它从格式字符串中解释其附加参数。
答案 3 :(得分:0)
不 - printf只获得32位(或其他)值,它不知道你认为它是什么类型。
答案 4 :(得分:0)
printf
的签名不是int printf(const *f)
。你在哪里得到那个奇怪的签名?
printf
的真实签名是int printf(const char *, ...)
。请注意最后的...
。 ...
代表在第一个参数之后传递给printf
的可变参数。第一个参数是格式(在您的情况下为"%d"
)。 printf
根据该格式解释其他参数。您指定%d
作为格式,这意味着下一个参数被解释为int
值,而不是地址。
答案 5 :(得分:0)
printf所需的唯一参数是格式字符串,必须可转换为const char *。这并不意味着其他参数必须是指针。除了查看格式字符串外,printf并不真正了解其他参数。它解析格式字符串,查找以%开头的模式。在你的情况下,它看到%d并说“堆栈上应该有一个int参数”,所以它会熄灭并抓住下一个参数并将其解释为int。如果您没有提供匹配的参数或提供错误类型的参数,它将打印垃圾。
答案 6 :(得分:0)
添加printf("%d", &i)
确实有效。
它不是打印i变量的值,而是打印保存变量的内存地址(&代表地址关闭)。