int iArr[3][3] ={{1,2,3},{4,5,6},{7,8,9}};
printf("%d/n",iArr);//2280752
printf("%d/n",iArr[0]);//2280752
printf("%d/n",*iArr[0]);//1
printf("%d/n",*(iArr[1]));//4
printf("%d/n",(iArr+1));//2280764
printf("%d/n",*(iArr+1));//2280764
printf("%d/n",*(*(iArr+1)));//4
printf("%d/n",&iArr[0]);//2280752
printf("%d/n",*(&iArr[0]));//2280752
个人理解
在多维数组中,* 一般是指向列的地址,而 & 指向行的地址。
何谓指向列的地址:
在定义数组时,我们肯定已经定义了数组的类型,比如int。iArr[0]是0行的首地址。
当用*iArr[0]的时候,编译器会根据首地址开始,查找2个字节大小的内存,等于是调用a[0][0]。
何谓指向行的地址:
iArr[0]是0行的首地址,当调用&iArr[0],它虽然返回的首地址和iArr[0]一样,
但它已经从指向列传为指向行了。调用*(&iArr[0]),编译器是把整行(在本列中是3个int的大小)
作为一个元素。所以*(&iArr[0])仍然取出的是首地址。
根据例子,可以这么说,指向列就是当知道一个首地址后,调用*,编译器将取的内存大小一个int型2个字节;
指向列就是当知道一个首地址后,调用*,编译器将取的内存大小6个字节(int a[3]),因为iArr是一个3*3的大小。
iArr[1]和iArr+1,它们指向的首地址虽然相同,但是代表的意义不一样。
iArr[1]是指向列的。iArr+1是指向行的。*iArr[1]取出的是iArr[1][0]的值。而*(iArr+1)实际上
只是把指向行转为指向列。