第一个
char a[1000];
scanf("%s",&a);
printf("%s\n",a);
system("pause");
第二个
char a[1000];
scanf("%s",a);
printf("%s\n",a);
system("pause");
为什么上面两个运行结果都正确?
对数组来说a数组首元素的地址和&a都指向数组的首地址,这两个地址值上来说一样。
scanf接收一长串字符后,都按这个地址一一往后填字符,a[1000]对应的字符就是相同的。
但是a和&a的区别在于地址偏移上&a+1是数组首地址+sizeof(a),也就是指向a数组a[1000]的后面了,而a+1指a[0]+1也就是a[1]代表的地址
scanf理论上只要取存放数据的地址。但是对于数组有点特殊。它的地址或者数组名都可可以作为地址来处理字符串。所有这里巧合的可以,但是对于其它类型,比如int,char,就需要取地址&
假如是单个变量
scanf("%d",&a);
才是对的,
但如果是数组的话,a这个数组名本来就是地址,可以直接用
scanf("%s",&a);
了。
&是占位符的作用
第一个因为是字符串数组,这里的scanf("%s",a);中的a既是一个地址,也是一个数组变量名,也可以是一个指向字符型变量的指针,不过前面有%s,所以可以说 定义时:char a[50]第二个是一般变量 &在这里: 为取地址运算符定义时:int a
对于数组,都正确。对于单个变量就不行了。
因为数组中 a a[0] &a[0] 和 &a 都是返回a[0]的地址