字符串数组与数组的不同

设a[5];
字符串数组首地址是a[],scanf输入的时候不用&,那数组scanf输入为什么要加&啊?

这是因为数组名(在本例中为a)本身代表数组的首地址,而字符串数组由于是存储字符串,因此一个字符串数组的每一个元素都是字符串的首地址。

但是数组存储的是数字,不是字符串。因此当你使用scanf函数输入数组时,需要加&符号,以便scanf函数能够找到每个数字的内存地址。

例如:

scanf("%d", &a[0]); 


这样scanf函数才能正确地输入数组a的第一个元素


字符串数组输入:
scanf("%s", a);
或者
scanf("%s", &a[0]);
这两种方式都是可以的,区别如下:

假设这个数组a在内存中的首地址为:0x00000001

scanf("%s", a);
a是数组名就是一个指向了数组首地址的指针, 即a就指向了0x00000001
所以这里直接传入a就可以了,输入的时候,数据从a指向的0x00000001地址开始存储

scanf("%s", &a[0]);
a本身是一个指针类型,指向了数组在内存中的起始地址,a[0]则是一个char类型的变量,
a[0]变量里的值存储在了内存中0x00000001地址开始的1个字节长度内存块上, 因为a[0]
是数组a的第一个元素,所以&a[0]得到的指针的值也是0x00000001  本质上来说a[0]的地址就是数组的首地址

scanf("%s", &a[1]); 
这个时候&a[1]拿到的地址就是0x00000002,表示数组第二个元素地址开始存储值

scanf输入数组时,需要加上&是因为数组名本质上就是指向首元素的指针,也就是数组的首地址。所以scanf需要输入数组的地址,以获取首地址的值,再通过指针进行遍历输入。而字符串数组首地址a[]就相当于一个指针,它直接指向首元素,scanf输入字符串时直接输入a即可,因为a就是指向首元素的指针。所以不需要加上&符号。

因为scanf函数要求输入变量的地址作为参数,而数组名就是该数组首地址的引用,因此在scanf函数中输入数组时需要加&符号。

scanf传得必须是指针,也就是地址。
比如int a;就需要&a;但是如果是数组,数组本身表示的是数组首元素的地址。也就是int a[10]里a就表示a[0]的地址;那a[3]的地址呢?可以这样,&a[3];这就是加&的数组,如果不加呢,可以这样(a+3)就可以了,a是a[0]的地址,那么a+3就是a[3]的地址。
所以数组的scanf赋值是要加&的。
但是printf里因为输出的不是地址而是值所以不用加&。