快速业务通道

数组名与指针典型面试题的分析(2)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-08

作者:王海宁,华清远见嵌入式学院讲师.

上次我们分析了数组名面试题目的前2个题目,下面我们再看下后面2道题目的解决思路.

上次题目的内容为:

1、 有一个一维数组int a1[10],定义一个指针,指向一维数组名.
2、 有一个一维数组int a2[10],定义一个指针,指向一维数组名的地址.
3、 有一个二维数组int a3[3][4],定义一个指针,指向二维数组名.
4、 有一个二维数组int a4[3][4],定义一个指针,指向二维数组名的地址.

还记得前2道题的分析方法吗,第一个题,应该定义一个int *p的指针来指向一维数组a1(这个是比较简单的).而第二个题目为定义int (*p)[10]来指向一维数组a2的地址.

我们这次先分析后面面两道题:

int a3[3][4]为二维数组,大家都知道他的物理意义是3行4列,但是我们都知道,计算机的内存是一维空间,即不可能按照一个面的方式存储二维数组的,那么计算机怎么存储呢,大家可以参考下C语言教材,二维数组是按照从上到下从左到右的顺序放置到一维内存空间的.

比如int a3[3][4] = {{1,2,3,4},{5,6,7,8}},在计算机分配了8个int空间按顺序存储1,2,3,4,5,6,7,8,那计算机怎么知道1,2,3,4为第一行那,而不是1,2为一行,3,4为一行那.看来a3中的“[4]”起到了很重要的作用.

那么我们还是回到题目上,定义一个指针指向a3,那么我们就先看下a3是怎么读内存的?a3 和a3 1,我们分别用%p来查看下他们的地址偏移,程序大家可以自己写,我们会发现他们两者的差值为16,我们又知道a3里面存着都是4个字节的int类型,那么可以知道,从a3到a3 1偏移了4个int单位,而这个4恰好是第二个方括号的数字.

那么我们定义的指针P偏移内存的方式也应该是4个int单位才能和a3匹配,很多同学在面试时给出int **p的结果是不对的,二维指针的偏移还是4个字节为一个偏移单位,跟我们分析的不一样.那我们如果去写一个指向4个int单位的指针那,大家可以考虑下使用小括号来帮助我们理解.

答案为:int (*p)[4].看到这个答案,和我们的第二题的答案很类似,我们可以这样认为,一维数组名的地址实质就是一个二维数组的一行.

下面我们看第四题,有涉及到数组名的地址的问题,二维数组名的地址,根据我们上次分析,可以知道,二维数组名的地址偏移实际上是一个二维数组对象,即偏移一个面,那么对于指针的定义,应该容易的得到:

int (*p)[3][4];

这样的答案.

综合这几道题目,我们能更深入的理解关于指针的含义了.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号