1.总结:
简单一句话就是:
对于本身无法表示地址信息的,要加&;本身表示的就是地址信息的,就不需要加&
2.为什么要&(取地址符)?
原理:
scanf读取时,我们需要告诉它往哪里存储数据,这个时候就需要告诉它地址
那么我们判断是否要加&,只需要看scanf后面的参数是否可以表示地址,如果可以表示地址,那么就不需要加&,如果不能表示地址,就需要加上&
3.具体啥时候不用加& ?
一般加&的情况比较多,我们直接看不加&的情况:
(1)指针
指针本来就是地址,这个毫无疑问不用加&
int a=0; int *p=&a; //取a的地址放入p中(int *是p变量的类型) scanf("%d",p);
(2)字符串变量
字符串变量就表示这个字符串存储的首地址,并且是连续存储的,所以知道了首地址就不需要&了
char *str=0; scanf("%s",str)
char str[20]={0}; scanf("%s",str);
(3)数组变量名(这里要注意看是否是下标访问)
不要加&:这里没有下标访问,arr是数组首元素的地址
int arr[10]=0; for(int i=0;i<10;i++) { scanf("%d",arr+i); }
要加&:这里是下标访问,要指定其地址,因为下标获得的值,不是地址
int arr[10]=0; for(int i=0;i<10;i++) { scanf("%d",&arr[i]); }