2014-03-25 110 views
1

我有一个简单的问题,关于在变量前面正确使用“&”。“&”使用printf()和scanf()

printf("34 * 7 = "); 
scanf("%d", &x); 
printf("The solution is 238 \n"); 
printf("Your solution is %d \n\n", x); 

我不明白为什么我必须使用“& X”读取用户输入的时候,为什么我就可以去使用printf()函数时没有。我想了解它背后的内容。

+3

提示:'printf'是否改变'x'的值?你将如何编写一个函数来改变'x'的值?在这种情况下,你的参数需要什么类型? – Zeta

+1

你知道'&'的意思吗? C语言参数中的 –

+0

按值传递。当你用printf输出变量时,它接受变量的值,但是对于scanf(),这将不起作用,因为scanf必须写入变量而不写入它的副本。这就是为什么它接受变量的地址。 – AlexT

回答

1

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”读取用户输入时

,因为这是语言厂商会选择如何定义它。即使没有printfscanf&运营商也能正常运行。

int *pointer_to_x = &x; 

现在,这是scanf("%d", pointer_to_x);相同scanf("%d", &x);

1

的scanf函数需要一个指针为int作为参数,在这种情况下,虽然printf的只是需要的中间体&是操作员的地址。

1

printf()的函数,您没有scanf()的函数改变变量 'X' 值,而必须更改的 'X' 的值。 “& X”给出的X的地址,这被传递给函数scanf()的,以及从用户所采取的值使用x的地址存储在X,最后当我们从函数返回scanf()x的值与用户给出的值一起存储。如果我们不使用'& x',那么scanf()函数将获得变量'x'的本地副本,并且当我们从函数返回时,这些更改不会反映出来。

+0

我试图在没有'&x'的情况下使用'scanf()'函数,它根本不起作用。我定义了'int x = 5',看看''scanf()'在不使用'&'时真的需要本地副本。 – Tametomo

+0

这里scanf()被设计为接收地址。我们必须传递地址,否则会给出错误。 – Vinay

+0

如果您了解有关按价值拨打电话和按参考号码拨打的电话,则您将了解需要将地址更好地传递给某个功能。以下是通过价值和参考解释调用的链接 http://www.codingunit.com/c-tutorial-call-by-value-or-call-by-reference – Vinay

0

参数总是按值方法调用。因此,无论您传递副本的参数都会被制作并存储在函数中。

但是使用指针,我们可以通过引用类型的函数调用!来实现一个函数'看起来像'。

对于如:

int fun(int *p) 
    { 
    p=1; 
    return p; 
    } 

现在采取的函数调用fun(&x);的一个例子,这个功能现在改变了x为1

值,以便在scanf()情况下,应该有一个分配发生在函数调用中,并且只能通过知道变量的地址(因为名称有一个作用域)才能将值赋给超出函数作用域的变量。

因此,由于这样的原因scanf()函数编码牢记参数将是一个地址,所以如果你通过除地址以外的任何东西,一些代码显然是错误的,从而导致错误。