码迷,mamicode.com
首页 > 编程语言 > 详细

多维数组和指针探讨

时间:2015-08-05 12:08:47      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

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

?

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

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是地址的地址,需要两次取值才可以得到通常的数值。地址的地址或指针的指针是双重间接的典型例子。

//多维数组和指针

#include<iostream>

int main()
{
??? int zippo[4][2] = {{2,4},
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{6,8},
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{1,3},
??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?{5,7}};
????
??? ?//首先验证第一个结论
??? ?//%p对应的数据类型为void*,输出是以16进制形式输出指针的值
??? ?printf("=======验证第一条结论========\n");
??? ?printf("zippo:\t\t%p\n&zippo[0]:\t%p\n",zippo,&zippo[0]);
??? ?printf("zippo[0]:\t%p\n&zippo[0][0]:\t%p\n",zippo[0],&zippo[0][0]);
??? ?printf("*zippo:\t%p\n",*zippo);
??? ?printf("\n");
??? ?printf("=======验证第二条结论========\n");
??? ?//zippo包含2个int,那么+1后向后移动8字节
??? ?printf("zippo:\t\t%p\nzippo+1:\t%p\n",zippo,zippo+1);
??? ?//zippo[0]包含1个int,那么+1后向后移动4字节
??? ?printf("zippo[0]:\t%p\nzippo[0]+1:\t%p\n",zippo[0],zippo[0]+1);
??? ?printf("\n");
??? ?printf("=======验证第三条结论========\n");
??? ?//验证:*和[]的作用是相同的,都是对地址(指针)取值
??? ?printf("*zippo:\t%p\nzippo[0]:\t%p\n",*zippo,zippo[0]);
?? printf("*(zippo+1):\t%p\nzippo[1]:\t%p\n",*(zippo+1),zippo[1]);
?? //验证:**zippo与zippo[0][0]相等,即zippo是指针的指针
?? printf("**zippo:\t%d\nzippo[0][0]:\t%d\n",**zippo,zippo[0][0]);
?? printf("*(*(zippo+2)+1)\t%d\nzippo[2][1]:\t%d\n",*(*(zippo+2)+1),zippo[2][1]);
??? ?return 0;
}

?

输出结果:

技术分享

?

多维数组和指针探讨

标签:

原文地址:http://www.cnblogs.com/zxdwe/p/4704237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!