程序如下
#include < stdio.h >
int main ( void )
{
int i;
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}
我想知道,为什么是取址&i?我知道这个的意思是将所输入的值对应到i所在内存地址,那为什么不能直接用i?
关于c语言scanf的用法
答案:4 悬赏:80
解决时间 2021-11-27 02:25
- 提问者网友:℡她的他i☆
- 2021-11-26 09:41
最佳答案
- 二级知识专家网友:萌萌哒小可爱
- 2021-11-26 10:21
其实这个问题很有意思,为什么非要传变百量的地址而不是直接传变量呢?
仅仅说是规定不能让人信服。我们假设scanf函数可以这样给i赋值:
scanf("%d", i);而不是scanf("%d", &i);
有的人可以说我可以在scanf函数内度在取i的地址赋值啊,不也行吗?
其实问题就出在这儿,因为c语言是传值的,那么scanf函数内部是不能取版得实参i的地址的,取得的是形参的地址而已,那么赋值的时候是给形参赋值了,i并没有改变。
即等价于一个形参temp,它是一个临时变量,其值等于i,但&temp的值与&i的值不同。
所以给实参i赋值失败。
您应该明白为什么权要传地址了吧,而printf的时候又不要传地址了。
仅仅说是规定不能让人信服。我们假设scanf函数可以这样给i赋值:
scanf("%d", i);而不是scanf("%d", &i);
有的人可以说我可以在scanf函数内度在取i的地址赋值啊,不也行吗?
其实问题就出在这儿,因为c语言是传值的,那么scanf函数内部是不能取版得实参i的地址的,取得的是形参的地址而已,那么赋值的时候是给形参赋值了,i并没有改变。
即等价于一个形参temp,它是一个临时变量,其值等于i,但&temp的值与&i的值不同。
所以给实参i赋值失败。
您应该明白为什么权要传地址了吧,而printf的时候又不要传地址了。
全部回答
- 1楼网友:修女的自白
- 2021-11-26 12:12
记住一点,scanf认为遇到“非法输入”就结束。
scanf("%2d%f",&a,&b);中第一个格式控制字符2d的意思是读取2位,作为一个整数输入到给对应的变量a的地址中。输入876,当然只读取前2位87。这是2的作用,后面输入对于2来说,相当于非法输入。
对于%f,后面输入的是7 543.0,对于浮点型数据是不可能得到空格的,所以遇到空格,认为是非法输入,结束输入。所以b的值是6,即是6.000000
- 2楼网友:时光不老我们不分离
- 2021-11-26 11:55
函数就是这样设计的
因为C语言的函数都是传值的,函数调用是不可能改变实参的值的
int i;
foo(i);//这个是不可能改变i的值的
i=foo(j);//重新赋值
foo(&i);//传i的地址,可以改变i的值
- 3楼网友:陪衬角色
- 2021-11-26 11:15
scanf的第二个参数被定义为一个指针(就是一个内存地址)
&运算计算出i的内copy存地址,然后作为scanf的参数
如果用i的话,知就是把i的值当作内存地址作为scanf的参数
显然i=0x00000000,不是一个有效的内存地址(c语言保证0永远不会是任何有效数据的地址)
函数scanf得不到正确的内存地址,难道你觉得道它猜得出i的地址吗
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯