c语言 scanf();为什么要用取地址符

# include <stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
printf("a=%d", a);
return 0;
}
为什么不是
# include <stdio.h>
int main(void)
{
int a;
scanf("%d", a);
printf("a=%d", a);
return 0;
}
为什么要用&,直接用变量名不是更直接?

scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

例如:&a、&b分别表示变量a和变量b的地址。

这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

变量的地址和变量值的关系
在赋值表达式中给变量赋值,如:
a=567;
则,a为变量名,567是变量的值,&a是变量a的地址。

但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-21

因为scanf这个函数要求的参数传递的是地址!!

函数原型:

int scanf(const char *format,...);

其调用形式为: 

scanf("<格式说明字符串>",<变量地址>);变量地址要求有效,并且与格式说明的次序一致。

追问

我知道需要传递地址,但是不明白的是:根据变量名不就可以找到内存地址吗,为什么不用变量名而用变量地址,

追答

这些基本类型,变量名传递过去的是当前变量的一个拷贝,在函数中对这些变量进行改变是不影响函数外这些变量的值的,为了得到结果并影响到这些变量,只有传递地址,或者对地址的引用。

本回答被提问者和网友采纳
第2个回答  2019-06-19
因为scanf本来就是一个函数
scanf本来就是一个函数,用取地址后就能将接受的数据存在这个地址里,在scanf函数外也能用。指针在函数内就是通过访问所指向地址的值来进行改写,并且能延续到函数外。
相似回答