一直想弄清楚的scanf中加&的问题
如:
int a;
scanf( "%d ", &a);
为什么用scanf给变量输入值的时候,要在变量名前加取地址符,这样才能找到输入的数应该存放的位置,而直接用赋值语句
a=3;
却不用取地址符?
同样的变量名,应该编译器负责找他们的地址,把数放进去,但却是两种不同的用法?
请问这是怎么回事?谢谢!
[解决办法]
scanf()函数释疑
http://dev.csdn.net/develop/article/49/49605.shtm
[解决办法]
像a=3;这样的语句完全是编译器的事情,所以怎么直观就怎么做。而scanf是一个函数,这个函数是程序员写的,不是编译器提供的某种神秘的组件,所以scanf遵循函数调用的规则,所以编译器没有自动去改成地址,而是让用户显式的修改
[解决办法]
想通过一个函数赋值,
那么必须操作这个函数的实参,
而不能是这个实参的某个副本,
所以,就使用了这个 & 获取地址的方式,
然后解引用来操作实参。
(因为以前没有 引用 这个东东)
[解决办法]
想改变函数的参数值(把形参作为实参),需要传地址进去。。。。请看c语言教材
[解决办法]
可能是因为C语言参数是值传递的方式
fun(int a)是无法改变实参的值的,只有传地址,采用fun(int *a)的定义方式
[解决办法]
在C语言中,何止scanf,任何一个函数,如果要想通过形参修改实参(或参数从函数中带出数据),不通过指针传地址,都是做不到的。
[解决办法]
scanf的第二个参数表示变量的地址scanf( "%d ",&a);
如果写成scanf( "%d ",a);意思就是a就是变量的地址。a是什么?a就是他其中的内容。
如果a的地址是004FF00其中的内容是0100(十进制是1),
而当你在控制台提示下输入5的时候上面两个语句的结果就是:
scanf( "%d ",&a);//地址是004FF00其中的内容变成05 00
scanf( "%d ",a);//地址是0100其中的内容变成05 00
显然第二句不是要的结果。
[解决办法]
更正一下
我把实参写成形参了 不好意思 以下进行了修改
C语言中函数调用参数传递方式有两种,一种是传值调用,一种是传址调用
传值调用不会改变实参的值,如果你想要改变实参的值,你就应该选用传址
scanf函数要修改变量,当然传址了,即scanf( "%d ",&a);
嘿嘿