scanf不加地址,关于scanf语句的一些疑问

1,关于scanf语句的一些疑问你老师说的大概是这个意思int a[20];int i;for(i=0;i<20;i++)scanf("%d",a+i);如果是对单变量就要加&比如int a[20];int i;for(i=0;i<20;i++)scanf("%d",&a[i]);只要记?。瑂canf要传变量地址就行了,而数组名是个地址 。具体情况具体对待 。举个例子来看看 。char 类型的变量接收时不需要取地址符char name[20];scanf("%s",name);其他 int float double 都需要取地址符int a;scanf("%d",&a);float a;scanf("%f",&a);//float 跟VC不兼容 必须有输出值printf("%f",a); 不然会出现错误提示double a;scanf("%lf",&a);
2,前面输入学号跟名字时为什么scanf函数后面不用取地址符而且上面的可以,是因为number和name都是 char [6] 数组,它可以隐式转换为 char (*)[6],所以不需要你加取址符,你加了取址符,得到的结果也是 char (*) [6] 。下面的score[j]是int 类型了,所以需要取址符 。scanf里面不要用空格,修改后的代码:#include<stdio.h>int main() int n, a[2000], i, j, t; scanf("%d ",&n); for(i=0;i<n;i++)scanf("%d",&a[i]); }for(i=0; i<n-1; i++)for (j=i+1; j<n; j++)if(a[i]>a[j])t=a[i];a[i]=a[j];a[j]=t;} }for(i=0;i<n;i++)printf("%d\n",a[i]); return 0;}
3,C语言编程时scanf输入的数值是地址还是一个数的值求助int a; scanf("%d",&a); 显然scanf要求的是变量地址,以便接收从键盘输入的数值 。采纳哦scanf是读取键盘的输入.在C语言中常中的输入函数为scanf(),但是这个函数有时也会带来一些隐藏的问题 。下面来看那个例子: 例1 #include main() { int i; int b; scanf("%d",&i); getchar(); } 为什么只输入一个数字或字母都会退出? 例2 #include main() { int i; int b; scanf("%d",&i); scanf("%d",&b); } 为什么输入一个数字不会退出,输入一个字母会退出? 例1 输入数字和字母实际上都是输入两个字符,你输入的数字getchar()读取下面的回车.如果是字母scanf("%d",&i)不做任何反应(scanf会跳过不匹配的,但并不把不匹配的字母从输入流中去掉),而getchar()读取你输入的字母 例2 在输入一个数字的时候,第一个scanf函数读取第一个数字,第二个scanf函数等待输入(scanf函数会跳过空格操作符 , 包括回车,空格等),所以 不能退出 。在输入一个字母的时候,第一个不能匹配跳过 , 所以第二个scanf函数仍然读取到一个字母而失去匹配,从而退出 函数,所以,不管有多少个int类型的scanf函数都会在输入一个字母的情况下退出 解决 这样的问题,比较好的办法就是在scanf()之后加一个输入缓冲区清理函数 fflush(stdin) 。这样就不会把当行的输入遗留到下次输入中使用了.【scanf不加地址,关于scanf语句的一些疑问】
4,printf和scanf函数为什么一个要取地址符一个不用呢因为scanf的取得一个字符,然后把这个字符存放到某一内存区域,所以要为它(字符)分配存储空间 。printf的输出一个字符 。输出的时候系统根据变量名(外部标识符)在内存中找到与之相匹配的字符进行输出操作 。所以不用取地址符 。你用scanf输入的时候,是要在函数内对变量值进行修改的 。而printf输出的时候,只用到变量的值,不必在函数内改变变量的值 。如果是普通的函数参数传递,比如传递a , 变量接收的方式是在函数内另外建立一个变量,假设是b,然后把a的值传递给b就可以了 。这样如果对b的值进行修改,不影响原来的a 。传地址则可以通过操作改变实参的值,比如把a的地址p1传递到函数中,函数中p2接收到了a的地址 , 因为p2指向的是a的地址,所以对p2地址指向的内容修改 , 就对原来的变量a修改了因为scanf的取得一个字符,然后把这个字符存放到某一内存区域 , 所以要为它(字符)分配存储空间 。printf的输出一个字符 。输出的时候系统根据变量名(外部标识符)在内存中找到与之相匹配的字符进行输出操作 。所以不用取地址符 。楼主不明白请追问 。如果某个函数要修改其它函数当中的变量,就必须要得到该变量的地址scanf的目的是修改变量的值 , 因此必须知道地址;printf的目的是输出变量的值,因此只知道变量的值就够了输出与变量的值有关,输入与变量的地址有关printf是输出,不用...因为你调用它时已经把要输出的数据用形参的方式传送给它了scanf是输入,形参可以说是局变量,函数执行完后就没了,传了地址让它保存到指定地址,这样数据就可保存了!5,c语言 scanf为什么要用取地址符scanf(“格式控制字符串”, 地址表列);其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串 , 也就是不能显示提示字符串 。地址表列中给出各变量的地址 。地址是由地址运算符“&”后跟变量名组成的 。例如:&a、&b分别表示变量a和变量b的地址 。这个地址就是编译系统在内存中给a、b变量分配的地址 。在C语言中,使用了地址这个概念,这是与其它语言不同的 。应该把变量的值和变量的地址这两个不同的概念区别开来 。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少 。变量的地址和变量值的关系在赋值表达式中给变量赋值,如:a=567;则,a为变量名,567是变量的值,&a是变量a的地址 。但在赋值号左边是变量名 , 不能写地址,而scanf函数在本质上也是给变量赋值 , 但要求写变量的地址 , 如&a 。这两者在形式上是不同的 。&是一个取地址运算符,&a是一个表达式 , 其功能是求变量的地址 。因为scanf本来就是一个函数scanf本来就是一个函数 , 用取地址后就能将接受的数据存在这个地址里,在scanf函数外也能用 。指针在函数内就是通过访问所指向地址的值来进行改写,并且能延续到函数外 。因为scanf要往你的变量里写入数值 , 所以他必须知道那个变量的地址,至于变量里存的是什么值,他是不管的,反正他写入之后就被覆盖成新的值了对比printf,他是要输出变量里的数值,他只管要那个值,至于地址在哪,他也无所谓这就是写和读的本质性区别,写只要地址,读只要值变量其实同时有地址和值两个东西,我们一般用一个变量,都是直接写一个名字,其实如果这个名字在赋值号右边,就是代表值 , 如果在赋值号左边,就是代表地址,写出来一样,意义是不一样的 , 编译器自动帮你选择了正确的意义变量名字写在函数参数里面时,和写在赋值号右边一样,也是代表值,可是像scanf这种函数,他确实需要地址,编译器只认识赋值号,不认识scanf , 没法自动选到正确的东西,这时就需要你手动加一个取地址的符号&,明确告诉编译器去选择变量的地址给这个scanf来用因为scanf这个函数要求的参数传递的是地址?。『停篿nt scanf(const char *format,...);其调用形式为: scanf("<格式说明字符串>",<变量地址>);变量地址要求有效 , 并且与格式说明的次序一致 。

    推荐阅读