前段时间刷题中,无心发现本身对多维数组和指针的关系不是很明确,开始google,没发现太靠谱的,因而翻书,果真在《C Primer Plus》中找到一段,分析的如此透彻,是否是这个太基础了,以致于别人都不肯意在网上写出来,如下摘自书中,并加上本身的理解:ios
指针和多维数组有什么关系?为何咱们须要知道它们之间的关系?函数是经过指针来处理多维数组的,所以在使用这样的函数以前,您须要更多地了解指针。对于第一个问题,让咱们经过几个例子来找出答案。为简化讨论,咱们采用比较小的数组。假设有以下的声明:数组
1 int zippo[4][2]; /*整数数组的数组*/
数组名zippo同时也是数组首元素的地址。在本例中,zippo的首元素自己又是包含两个int的数组,所以zippo也是包含两个int的数组的地址。下面从指针属性进一步分析:函数
1 //多维数组和指针 2 3 #include<iostream> 4 5 int main() 6 { 7 int zippo[4][2] = {{2,4}, 8 {6,8}, 9 {1,3}, 10 {5,7}}; 11 12 //首先验证第一个结论 13 //%p对应的数据类型为void*,输出是以16进制形式输出指针的值 14 printf("=======验证第一条结论========\n"); 15 printf("zippo:\t\t%p\n&zippo[0]:\t%p\n",zippo,&zippo[0]); 16 printf("zippo[0]:\t%p\n&zippo[0][0]:\t%p\n",zippo[0],&zippo[0][0]); 17 printf("*zippo:\t%p\n",*zippo); 18 printf("\n"); 19 printf("=======验证第二条结论========\n"); 20 //zippo包含2个int,那么+1后向后移动8字节 21 printf("zippo:\t\t%p\nzippo+1:\t%p\n",zippo,zippo+1); 22 //zippo[0]包含1个int,那么+1后向后移动4字节 23 printf("zippo[0]:\t%p\nzippo[0]+1:\t%p\n",zippo[0],zippo[0]+1); 24 printf("\n"); 25 printf("=======验证第三条结论========\n"); 26 //验证:*和[]的做用是相同的,都是对地址(指针)取值 27 printf("*zippo:\t%p\nzippo[0]:\t%p\n",*zippo,zippo[0]); 28 printf("*(zippo+1):\t%p\nzippo[1]:\t%p\n",*(zippo+1),zippo[1]); 29 //验证:**zippo与zippo[0][0]相等,即zippo是指针的指针 30 printf("**zippo:\t%d\nzippo[0][0]:\t%d\n",**zippo,zippo[0][0]); 31 printf("*(*(zippo+2)+1)\t%d\nzippo[2][1]:\t%d\n",*(*(zippo+2)+1),zippo[2][1]); 32 return 0; 33 }
输出结果:google