多维数组和指针探讨

        前段时间刷题中,无心发现本身对多维数组和指针的关系不是很明确,开始google,没发现太靠谱的,因而翻书,果真在《C Primer Plus》中找到一段,分析的如此透彻,是否是这个太基础了,以致于别人都不肯意在网上写出来,如下摘自书中,并加上本身的理解:ios

 分析

指针和多维数组有什么关系?为何咱们须要知道它们之间的关系?函数是经过指针来处理多维数组的,所以在使用这样的函数以前,您须要更多地了解指针。对于第一个问题,让咱们经过几个例子来找出答案。为简化讨论,咱们采用比较小的数组。假设有以下的声明:数组

 
1 int zippo[4][2];  /*整数数组的数组*/
 

数组名zippo同时也是数组首元素的地址。在本例中,zippo的首元素自己又是包含两个int的数组,所以zippo也是包含两个int的数组的地址。下面从指针属性进一步分析:函数

  • 由于zippo是数组首元素的地址,因此zippo的值和&zippo[0]相同(若这样,那么*zippozippo[0]是相同的)。另外一方面,zippo[0]自己是包含两个整数的数组,所以zippo[0]的值同其首元素(一个整数)的地址&zippo[0][0]相同。简单地说,zippo[0]是一个整数大小对象的地址,而zippo是两个整数大小对象的地址。由于整数和两个整数组成的数组开始于同一个地址,所以zippozippo[0]*zippo也相同)具备相同的数值。
  • 对一个指针(也即地址)加1,会对原来的数值加上一个对应类型大小的数值。在这方面,zippozippo[0]是不同的,zippo所指向对象的大小是两个int,而zippo[0]所指向对象的大小是一个int。所以zippo+1zippo[0]+1的结果不一样。
  • 对一个指针(也即地址)取值(使用运算符*或者带有索引的[]运算符)获得的是该指针所指向对象的数值。由于zippo[0]是其首元素zippo[0][0]的地址,因此*(zippo[0])表明存储在zippo[0][0]中的数值,即一个int数值。一样,*zippo表明其首元素zippo[0]的值,可是zippo[0]自己就是一个int数的地址,即&zippo[0][0],所以*zippo&zippo[0][0]。对这两个表达式同时应用取值运算符将获得**zippo等价于*&zippo[0][0],后者简化后即为一个intzippo[0][0]。简言之,zippo是地址的地址,须要两次取值才能够获得一般的数值。地址的地址或指针的指针是双重间接的典型例子。

代码

 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

相关文章
相关标签/搜索