user-0 提问: scanf("%s",name);字符串数组输入带不带取地址符的问题

回复:
user: user-1
content: scanf读取的时候只看传过来的值，这两个参数在数值上是一样的，因此scanf能正确读写。但本质上name和&name是不一样的，数组名在运算时会转换成指针，所以name是指向第一个元素的指针，name+1则指向第二个元素，&name是整个数组的首地址，&name+1指向数组的后面

user: user-2
content: 你这个并不是name和&name的区别，而是你对name+1、&name+1、(&name)+1三者的理解  第一个，name和&name一样，都代表数组的首地址，或者name[0]的地址，所以name+1代表name[1]的地址，注意&(name+1)的写法是错的，因为name+1已经表示地址了，再对地址取地址就是**了，但是&name里，name表示的是数组，是可以这么写的  二和三一样，表示下一个name[20]的首地址，+1的出现改变了&name原因的意义，同理+2就是下下个char数组的首地址  但是在指针里又不一样，比如如果是char *name；name+1表示指向name[1]的值， &name+1、(&name)+1表示name[1]的地址，而一个地址是四字节，所以是&name的值+4

user: user-3
content: 学习了 &数组 就是数组指针了 的确也是

user: user-4
content: name在字符串中本就是该字符串的首地址，而不是int类型的，若加上&取址，就是把地址取了两次了

user: user-5
content: 数组名可以被当作指针，好理解，但数组名并不是指针 &加数组名，那么这个得到的地址是整个数组的地址 不加 & ，那么这个地址是数组首元素的地址 int a[10]; p = a;     //p指向 a 数组的首元素 p+1 指向数组的第二个元素。p只指向一个int类型 p = &a; //p之指向a整个数组，p+1指向a[10] 越界。p指向10个int类型

user: user-6
content: 都可以啊，标准应该是要有的，但是c语言提供了方便程序员操作的方式，不加也可以

user: user-7
content: 比如有一个二维数组 char[20][20], 现在让name=& char[0][0]; 此时name 指向二维数组数组char[0][0]的首地址，是一个字符指针（指向二维数组的列数，name+1等于前进一列） &name  指向装有若干个数组的数组的第一个数组的地址（指向一个二维的行数，&name+1等于换行）

user: user-8
content: name  &name  都是地址，地址内容相同，即整个数组的首地址，数组第一个元素的首地址，但地址类型不同 一个 指向char，一个指向char数组 ，故做地址加1运算时偏移量为sizeof(type)*1

user: user-9
content: 引用 4 楼 kuangbao9 的回复:[quote=引用 3 楼 sunflower_25 的回复:] [quote=引用 1 楼 kuangbao9 的回复:] 我瞎猜一下：首先name本身是数组的首地址， 而&name是整个数组的地址，所以理论上name和&name地址是一样的，都是指向数组首地址。 其次，name + 1表示的是数组第二个元素的地址，而(&name)+1表示的是数组最后一个元素的地址的下一个地址。  我试验name地址是FF20，但(&name)+1却是FF34。对于name是一个20个字节的数组。[/quote]  FF34这不正好是最后一个元素地址的下一个地址嘛。。。。[/quot]  地址是十六进制表示的

user: user-10
content: 字符串数组不带&，如name[10]；输入字符串就是scanf（“%d”，name）； 因为数组名name本身就是数组的地址；

user: user-11
content: 理解和讨论之前请先学会如何观察！  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-12
content: 引用 5 楼 paschen 的回复:正确的是使用name，name和&name仅仅只是地址相同，但他们是完全不同的类型，前者数组退化后的char*类型，后者是指向数组的指针，这也是为什么他们+1后的值不一样的原因，前者+1移动一个字符，后者则移动一个数组大小的长度 很详细，其实读取字符串一般不加地址符，数组名表示首地址

user: user-13
content: 正确的是使用name，name和&name仅仅只是地址相同，但他们是完全不同的类型，前者数组退化后的char*类型，后者是指向数组的指针，这也是为什么他们+1后的值不一样的原因，前者+1移动一个字符，后者则移动一个数组大小的长度

user: user-14
content: 引用 3 楼 sunflower_25 的回复:[quote=引用 1 楼 kuangbao9 的回复:] 我瞎猜一下：首先name本身是数组的首地址， 而&name是整个数组的地址，所以理论上name和&name地址是一样的，都是指向数组首地址。 其次，name + 1表示的是数组第二个元素的地址，而(&name)+1表示的是数组最后一个元素的地址的下一个地址。  我试验name地址是FF20，但(&name)+1却是FF34。对于name是一个20个字节的数组。[/quote]  FF34这不正好是最后一个元素地址的下一个地址嘛。。。。

user: user-0
content: 引用 1 楼 kuangbao9 的回复:我瞎猜一下：首先name本身是数组的首地址， 而&name是整个数组的地址，所以理论上name和&name地址是一样的，都是指向数组首地址。 其次，name + 1表示的是数组第二个元素的地址，而(&name)+1表示的是数组最后一个元素的地址的下一个地址。  我试验name地址是FF20，但(&name)+1却是FF34。对于name是一个20个字节的数组。

user: user-15
content: 地址是一样的，但是类型是不一样的。name是数组名，可以理解位指针常量，是属于一维指针，而&name是属于二维指针。那么&name相当于name的地址，即&name + 1相当于偏移sizeof(name)个字节。而name + 1偏移是1个字节。

user: user-14
content: 我瞎猜一下：首先name本身是数组的首地址， 而&name是整个数组的地址，所以理论上name和&name地址是一样的，都是指向数组首地址。 其次，name + 1表示的是数组第二个元素的地址，而(&name)+1表示的是数组最后一个元素的地址的下一个地址。