我有一个简单的问题,关于在变量前面正确使用“&”。“&”使用printf()和scanf()
printf("34 * 7 = ");
scanf("%d", &x);
printf("The solution is 238 \n");
printf("Your solution is %d \n\n", x);
我不明白为什么我必须使用“& X”读取用户输入的时候,为什么我就可以去使用printf()函数时没有。我想了解它背后的内容。
我有一个简单的问题,关于在变量前面正确使用“&”。“&”使用printf()和scanf()
printf("34 * 7 = ");
scanf("%d", &x);
printf("The solution is 238 \n");
printf("Your solution is %d \n\n", x);
我不明白为什么我必须使用“& X”读取用户输入的时候,为什么我就可以去使用printf()函数时没有。我想了解它背后的内容。
In C, C++, and Go, a prefix "&" is a unary operator denoting the address in memory of the argument, e.g. &x, &func, &a[3].
我不明白为什么我必须使用“& X”读取用户输入时
,因为这是语言厂商会选择如何定义它。即使没有printf
和scanf
,&
运营商也能正常运行。
int *pointer_to_x = &x;
现在,这是scanf("%d", pointer_to_x);
相同scanf("%d", &x);
的scanf函数需要一个指针为int作为参数,在这种情况下,虽然printf的只是需要的中间体&是操作员的地址。
在printf()的函数,您没有scanf()的函数改变变量 'X' 值,而必须更改的 'X' 的值。 “& X”给出的X的地址,这被传递给函数scanf()的,以及从用户所采取的值使用x的地址存储在X,最后当我们从函数返回scanf()x的值与用户给出的值一起存储。如果我们不使用'& x',那么scanf()函数将获得变量'x'的本地副本,并且当我们从函数返回时,这些更改不会反映出来。
参数总是按值方法调用。因此,无论您传递副本的参数都会被制作并存储在函数中。
但是使用指针,我们可以通过引用类型的函数调用!来实现一个函数'看起来像'。
对于如:
int fun(int *p)
{
p=1;
return p;
}
现在采取的函数调用fun(&x);
的一个例子,这个功能现在改变了x
为1
值,以便在scanf()
情况下,应该有一个分配发生在函数调用中,并且只能通过知道变量的地址(因为名称有一个作用域)才能将值赋给超出函数作用域的变量。
因此,由于这样的原因scanf()
函数编码牢记参数将是一个地址,所以如果你通过除地址以外的任何东西,一些代码显然是错误的,从而导致错误。
提示:'printf'是否改变'x'的值?你将如何编写一个函数来改变'x'的值?在这种情况下,你的参数需要什么类型? – Zeta
你知道'&'的意思吗? C语言参数中的 –
按值传递。当你用printf输出变量时,它接受变量的值,但是对于scanf(),这将不起作用,因为scanf必须写入变量而不写入它的副本。这就是为什么它接受变量的地址。 – AlexT