热心网友
回答时间:2024-02-08 06:23
&是取地址运算符,scanf读取时,你得告诉他往哪里存储读进来的数据,所以要告诉他“地址”。
因此,对于本身无法表示地址信息的,往往要加&来“获取地址”,本身表示的就是地址信息的,就不需要加&来取地址。
判断的依据可以看做,scanf后面的参数,是否能够反应地址信息,不能你就需要以直接(使用&)或者间接(使用指向该位置的指针)的方式来传给给scanf地址,能就不需要取地址。
对于直接的变量类型,例如:
int a;
a表示的是变量名,因此,你想写入一个数据到a所在的空间中,就应当获取到a的地址,所以要用&a,即
scanf("%d", &a);
对于指向变量的指针,由于指针本身就表示地址 ,所以用指针控制时,就不需要加&,即
int a;
int* p = &a;//取地址来初始化指针
scanf("%d", p);
对于字符串类型,例如:
char *str;
C语言规定,字符串变量就表示这个字符串存储的首地址,并且由于是连续存储,所以知道了首地址就知道只能存了,因此读取字符串时,就不需要取地址了,本身它就代表地址:
scanf("%s", str);
数组同理,数组变量名代表数组存储空间的首地址,因此也不需要加取地址:
int a[10];
for(/*循环控制变量为i*/){
scanf("%d", a + i);
}
上面中,由于a是首地址,则a+i只要没有越界,那么就可以表示某个元素的地址,因此可以这样循环来给数组赋值。
但是如果你使用下标访问来赋值,则需要指定其地址,因为下标获得的是值,不是地址:
int a[10];
for(/*循环控制变量为i*/){
scanf("%d", &a[i]);//要获取a[i]的地址才行
}
暂时想到的应该就这几种主要的应用场景,其他没想到的也都是同理,能反应地址信息就不需要&,不能的话就需要。
收起