中易网

关于c语言scanf的用法

答案:4  悬赏:80  
解决时间 2021-11-27 02:25
程序如下
#include < stdio.h >
int main ( void )
{
int i;
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}
我想知道,为什么是取址&i?我知道这个的意思是将所输入的值对应到i所在内存地址,那为什么不能直接用i?
最佳答案
其实这个问题很有意思,为什么非要传变百量的地址而不是直接传变量呢?
仅仅说是规定不能让人信服。我们假设scanf函数可以这样给i赋值:
scanf("%d", i);而不是scanf("%d", &i);
有的人可以说我可以在scanf函数内度在取i的地址赋值啊,不也行吗?
其实问题就出在这儿,因为c语言是传值的,那么scanf函数内部是不能取版得实参i的地址的,取得的是形参的地址而已,那么赋值的时候是给形参赋值了,i并没有改变。
即等价于一个形参temp,它是一个临时变量,其值等于i,但&temp的值与&i的值不同。
所以给实参i赋值失败。
您应该明白为什么权要传地址了吧,而printf的时候又不要传地址了。
全部回答
记住一点,scanf认为遇到“非法输入”就结束。 scanf("%2d%f",&a,&b);中第一个格式控制字符2d的意思是读取2位,作为一个整数输入到给对应的变量a的地址中。输入876,当然只读取前2位87。这是2的作用,后面输入对于2来说,相当于非法输入。 对于%f,后面输入的是7 543.0,对于浮点型数据是不可能得到空格的,所以遇到空格,认为是非法输入,结束输入。所以b的值是6,即是6.000000
函数就是这样设计的 因为C语言的函数都是传值的,函数调用是不可能改变实参的值的 int i; foo(i);//这个是不可能改变i的值的 i=foo(j);//重新赋值 foo(&i);//传i的地址,可以改变i的值
scanf的第二个参数被定义为一个指针(就是一个内存地址) &运算计算出i的内copy存地址,然后作为scanf的参数 如果用i的话,知就是把i的值当作内存地址作为scanf的参数 显然i=0x00000000,不是一个有效的内存地址(c语言保证0永远不会是任何有效数据的地址) 函数scanf得不到正确的内存地址,难道你觉得道它猜得出i的地址吗
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
禪和的意思是什么?禪和的释义是什么啊?
呲姑娘什麼意思
一负的意思是什么啊?请解释下!
穿上袜子就脚痒的厉害,是怎么回事?
vb中的MouseUP和MouseDown事件在VB中的哪里?
部落冲突建筑大师怎么解锁
北凤社区居委会地址有知道的么?有点事想过去
麝笺的意思是什么啊?请解释下!
为什么新下的安卓版开心消消乐不能用QQ登陆
一个成年女人和小男生亲吻会怎么
升平社区居委会办公地址在什么地方,我要处理
分数线达不到3A,是不是一定读不了3A的学校
麻烦各位帮我列出美国英雄中最后带有“侠”字
反朴还淳的意思是什么啊?请解释下!
梅溪社区居委会办公地址在什么地方,我要处理
推荐资讯
听作文老师讲写水果的作文的体会500
uC,百度,搜狗,那个强大
你们说从高中恋爱能坚持到结婚么,还是异地恋
危旆的意思是什么啊?请解释下!
社区app开发制作和运营管理后台的建设有什么
关于2011届成人高等教育毕业生图像信息需要到
外墙粉刷砂浆稀一点好还是稠一点好
甜菜根哪里有卖
什么花在冬天开
可以拿菊花茶洗脸不
荣耀V9体验评测:荣耀V9性能怎么样值得买吗
请问有谁了解集成吊顶?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?