为什么我在csdn里看到此类文章有的说
int main() {
char password[20] = { 0 };
//scanf输入时都需要传入内存地址,但是数组的名称就是内存地址第一位。
scanf("%s", &password);//abc123
有的又不用&符号

为什么我在csdn里看到此类文章有的说
int main() {
char password[20] = { 0 };
//scanf输入时都需要传入内存地址,但是数组的名称就是内存地址第一位。
scanf("%s", &password);//abc123
有的又不用&符号

以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
在C语言中,scanf函数用于从标准输入读取数据并存储到指定的变量或数组中。对于字符数组(字符组)的情况,使用scanf读取字符串时是否需要加'&'符号取决于数组的声明方式。当你声明一个字符数组时,数组名本身就是一个指向数组首元素的指针,因此在使用scanf读取字符串时不需要加'&'。而对于基本数据类型(如int、float等),由于其不是数组,需要使用'&'来获取其地址。
对于你给出的两段代码示例:
在图1中,你的注释是正确的。当你使用字符数组作为参数传递给scanf时,不需要使用'&'符号,因为数组名本身就是一个指针。因此,代码中的scanf("%s", pet);是正确的。对于基本数据类型(如int和float),需要使用'&'来获取变量的地址,所以代码中的scanf("%d %f",&age,&assets);也是正确的。
在图2中,代码与图1相同,也是正确的。注释中的说明也是准确的。对于字符数组(如pet),不需要使用'&',所以scanf("%s", pet);是正确的。对于基本数据类型(如age和assets),需要使用'&',所以代码中的scanf("%d %f",&age,&assets);也是正确的。两段代码实际上是相同的,只是格式稍有不同而已。
总结起来,对于字符数组(字符组),在使用scanf读取字符串时不需要使用'&',而对于基本数据类型(如int和float等),在使用scanf时需要'&'来获取变量的地址。这是因为数组名在C语言中是一个指针,而基本数据类型变量本身不是指针类型。