繁体   English   中英

使用“&”与printf()和scanf()一起使用

[英]The usage of “&” working with printf() and 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, eg &x, &func, &a[3].

我不明白为什么在阅读用户输入时必须使用“&x”

因为这是语言制定者选择定义它的方式。 即使没有printfscanf&运算符也能正常工作。

int *pointer_to_x = &x;

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

scanf函数将一个指向int的指针作为参数,在这种情况下,printf只接受int。 &是运营商的地址。

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

在参数中总是通过值调用方法传递。 因此无论您传递什么参数,副本都会被创建并存储在函数中。

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

例如:

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

现在举一个函数调用fun(&x);的例子fun(&x); ,此函数现在将x的值更改为1。

因此,在scanf()情况下,应该在函数调用中发生赋值,并且只能通过知道变量的地址(因为名称具有范围)来为函数范围外的变量赋值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM