我正在尝试从控制台获取输入的不同方法的优点和缺点。我对scanf
感到困惑。为什么我需要使用&favNumber
代替favNumber
?
我了解&favNumber
是favNumber
的地址位置,但为什么会这样做?
我觉得这里的类型不匹配favNumber
是一个int,我告诉scanf
它是指向int的指针。我以为我把头包裹在指针附近,但这让我感到困惑。任何帮助,将不胜感激。谢谢!
#include <stdio.h>
int main()
{
char userPrompt[100] = "What is your favorite number?";
int favNumber;
printf("%s", userPrompt);
scanf("%d", &favNumber);
printf("%d", favNumber);
return 0;
}
答案 0 :(得分:3)
按值调用函数时,函数会获取参数的副本。对函数中参数的任何更改都不会影响原始变量的值。
void foo(int i )
{
i = 20; // The change is local to the function.
}
void bar()
{
int i = 10;
foo(i);
printf("i=%d\n", i); // i is still 10.
}
如果希望函数更改变量的值,则函数必须使用指针类型,并且调用函数时调用函数必须使用变量的地址。
void foo(int* i )
{
*i = 20; // The change is visible in the calling function
}
void bar()
{
int i = 10;
foo(&i);
printf("i=%d\n", i); // i is now 20.
}
这就是scanf
期望指针和调用函数在调用scanf
时必须使用变量地址的原因。 scanf
必须能够设置变量的值。
答案 1 :(得分:3)
&
符号用于通过其内存地址引用值。因此,当传递引用时,使用该引用会修改引用所在地址的值。
scanf
基本上只是一个函数,如果您熟悉函数,您会看到按值传递给函数的参数将是函数的本地参数,并且对它的任何赋值都只会更改其值该函数(不满足在传递的变量中存储“扫描”值的需要)。在scanf
的情况下,它接受引用(换句话说,该值的内存中的位置),因此它可以修改该位置的值,并且“scaned”值可以存储在感兴趣的变量中。
所以要把&favNumber
传递给scanf
的{{1}}变量的内存地址包含起来,其中favNumber
变量的内存地址是int
,所以{{1}然后将值写入该地址,并可由int
访问。
答案 2 :(得分:2)
&#34;你如何使用scanf在C中获取int?&#34;
- 你不是。您使用更合理的方法(例如fgets()
+ strtol()
),因为scanf()
古怪且笨拙且难以正确使用。
然而,你的问题显然与此无关;当scanf("%d", &favNumber);
为&favNumber
但int *
指定%d
时,您问为什么必须写int
。
好吧,您似乎将类型安全/类型不匹配与库函数所期望的任意类型表示混淆。
&favNumber
确实是指向int的指针。但是,%d
说明符 NOT 表示&#34;您必须为此参数传递int
&#34;。 %d
是一个库定义的表示法,它告诉scanf()
扫描一个整数,并将其放入下一个参数中。为了使scanf()
能够修改你的参数,你需要传递一个指向它的指针,实际上这个函数希望你传递一个指向它的指针。
我可以这样说:"%d"
只是意味着与printf()
和scanf()
一起使用时会有所不同:在前一种情况下,它意味着您传递int
参数,在后一种情况下,这意味着你应该传递int *
。
同样,情况也是如此,因为这些格式字符串具有没有固有的语义。它是解释它们的格式化输入/输出函数 - 在这种情况下,它们以不同的方式解释格式字符串技术必要性原因。
答案 3 :(得分:0)
好吧所以我相信你的困惑就是'&amp;'表示地址,而不是指向地址的指针,因为'*'表示地址本身。您将告诉扫描功能它将存储从用户接收的值。 如果您要引用变量本身即'favNumber',您如何知道存储在stdin中的值的位置? favNumber只是一个容器,它没有什么特别的,只是内存中的一个位置,用于保存所述字节数。我觉得好像我明白你的问题来自哪里,但如果你已经遇到过指针,我想你可能会混淆两者。指针指向内存中的地址,'&amp;'表示实际地址,并且大致表示指针将执行的操作,但是指向非指针变量。 如果favNumber是'int *'类型,那么你就不需要&符号,因为它已经是一个地址,但是你需要取消引用该地址才能分辨它内部的内容。这大致是你在favNumber中所拥有的,这是一个解除引用的地址指针,它显示存储在favNumber地址中的内容,该地址是在程序运行的开头,在堆栈中分配的。