gpt4 book ai didi

c - 为什么 printf() 可以解析变量名以访问存储在其中的值,但 scanf() 不能(在 C 编程中)?

转载 作者:太空宇宙 更新时间:2023-11-04 06:02:54 24 4
gpt4 key购买 nike

scanf() 需要一个指针作为参数,但 printf 不需要。printf 只需要变量的名称,它似乎以某种方式获取存储在变量的内存位置中的值。为什么 scanf 没有通过将变量名解析到内存位置(与 printf 的工作方式相同)并将值存储在其中来以相同的方式运行?

  1. printf("%d",&var) 和 printf("%d",var) 有什么区别
  2. printf("%p",&var) 和 printf("%p",var) 有什么区别

最佳答案

C 是一种按值传递的语言。如果你要写:

int x;
scanf("%d", x);

scanf 不知道将扫描结果放在哪里 - 您需要向它传递一个指向存储扫描值的内存位置的指针:

scanf("%d", &x);

如果这有助于您理解它,您还可以创建一个显式指针变量:

int *y = &x;
scanf("%d", y);

相反,printf 不关心值位于何处,只关心值恰好是什么。所以传递值:

printf("%d", x);

就好了。至于您的具体问题(假设 int var;):

What is the difference between printf("%d",&var) and printf("%d",var)

严格来说,第一个导致未定义的行为,第二个打印var 的值。在实践中,很多实现会在第一种情况下打印 var 的地址。

What is the difference between printf("%p",&var) and printf("%p",var)

这种情况正好相反。第一个打印 var 的地址,第二个导致未定义的行为。实际上,它可能会打印 var 的值,但您不应该依赖它。准确地说,第一个也应该是 printf("%p", (void *)&var);,但我从未见过您在那里编写的实现不会不能正常工作。

关于c - 为什么 printf() 可以解析变量名以访问存储在其中的值,但 scanf() 不能(在 C 编程中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16023886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com