int (*p)[6] = arr;//定义一个数组指针指向二维数组的首地址arr
这行奇葩的代码就不做点评了,在如果在C++的编译器里编译器绝对打脸。
数组名代表的指针其实是降了一级的指针,比如你写int p[10],数组名p并不是指向十个int元素,而是指向第一个int元素,如果希望得到int [10]的指针应该使用&p;int arr[3][4]也是如此,arr并不是指向arr[3][4],而是指向第一个int [4]数组,要指向整个int [3][4]使用&arr。
他们的地址都是一样的,都是指向第一个元素的地址,但是他们的指针指向的对象长度是不一样的。
先说些这个2维数组:int arr[3][4]
可以理解为一个3行四列的矩阵,那么第一维arr[0],arr[1],arr[2]中存的分别是对应行的地址,也就是说arr[0]存的是一个“大小为4的整形数组地址”
这样的话就好理解了,arr存的地址值其实与arr[0]本质上是相同的。都是这个连续空间的开始地址。
第一个问题,arr是个地址变量,因此它本身是个地址,而它存的其实也是个地址。
第二个问题,&arr也是首地址,不过叫“2维数组的首地址”,却别的话就是它有个宽度,举个例子:“&arr+1”其实相当于“&arr[sizeof(a)+1]”这里arr大小为7,那么&arr+1就是从二维数组首地址开始后的第8个整形变量空间的地址。当然从地址值的角度看它们是没有什么却别的,区别在于“指针宽度”
不知道你明白没?