[C]为何scanf("%s", str)不需要&运算

来源:互联网 发布:private是什么意思java 编辑:程序博客网 时间:2024/04/29 04:59

学习C的话,一定会接触到2个语句,scanf和printf。这两个函数都是被定义在头文件stdio.h里的常用函数,在使用的时候需要加上#include<stdio.h>来保证可以成功调用到这2个函数。

scanf是格式输入函数,它按照程序猿指定的格式,从键盘上把数据输入到指定的变量之中。


scanf的用法是

int a;//声明(待输入)变量a为int(Integer,整形)数据类型,系统会分配一段内存地址给a变量  scanf("%d",&a);//从键盘以十进制的形式(%d,decimal system)格式扫描(scanf,formatted-scan)一个输入量,将之存储在变量a所在的地址(&a)  

%是格式的前缀,%d表示十进制,%o表示八进制,%f表示浮点数...其他的类型,读者可以自行查阅,在此不做赘述....

&是取址运算,&a即取a变量的内存地址。

其实整个scanf函数的核心就是定义扫描的数据为何种格式类型,将之存放在什么位置。


初学者在实践的过程中会发现这么一个问题:为什么在scanf函数里,有的输入变量前面不用加“&”符号?

char str[10];  scanf("%s",str);//str前面不用加“&”符号 

正如前文所说,scanf的目的是将格式化的数据存储到一个地址……“&"运算得到的结果是一个内存地址,我们就是将某个变量写到这个内存地址里去...

scanf("%s",str)里的str不需要加“&”运算,其原理已涉及到指针的相关知识。

定义str[10] 为 char数据类型,则str[10]是一个数组,str表示数组所在的内存段的头地址。而scanf()函数所需要的地址,其实质就是一段数据所对应的内存段的起始地址,str已经是其数据所在的内存段的头地址,自然不需要“&”取值。当然,加上的话,也不会报错……


建议

新手在遇到这个问题时,直接忽略。在scanf所需的变量前面都加"&",待学到指针后,再做进一步研究……





原创粉丝点击