快速业务通道

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

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

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

最近,在发现学员找工作的时候,很多公司都问到了二维指针,二维数组,以及指向数组的指针的相关问题,在此,简单的给大家总结下,为大家在面试的时候增加一定的信心.

这类题目,总的来说,实际上可以归纳为如下几点:

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

对于这类题目,刚看到,似乎感觉比较没有思路,其实我们细心思考下,这四个问题,都是让我们定义一个指针,指向一片连续的内存空间,只是说这片内存空间有的是一维,有的是二维而已.

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

那我们先看第一个题目,a1本身就是连续空间的首地址,那么我们就只需要定义一个地址变量p,让p = a就可以了,既然要用“=”,那么等号两边就需要的类型一样,毫无疑问,p应该为 <数据类型> *p了.现在不确定的就是数据类型了.根据指针的定义,应该有p[0]到p[1]的偏移和a[0]到a[1]的偏移一致,我们很容易看出,a[0]和a[1]的偏移是int类型.那么对于第一个题目的数据类型就应该为int了,第一题的答案为int *p;

接着看第二问题,这个问题的难点在,什么叫数组名的地址,我们都知道C语言中的变量都有地址,但数组名是什么,他是不是也在内存中实实在在的存在哪,回答是否定的(感兴趣的同学,可以试着证明下,a的值和&a的值有什么特点).a是数组空间的一个标号,那对标号取地址,是什么那,我们可以试着把&a和&a 1的地址都打印出来,然后看下他们的关系,我们会发现,&a和&a 1之间的偏移实际上是10个int的单位.那么我们也可以推出数组名的地址原来标示了整个数组的空间.也就是说&a[0]和&a[1]的偏移实际上是一个int [10]的空间.那么对于<数据类型> *p来说,数据类型就是指int [10]这个空间了.第二题的答案为int (*p)[10];

对于前2个问题,可以写出如下实验代码:

int main(int argc,char *argv[])
{
int a1[10];
int *p;
int (*p1)[10];

printf(“the address of a1[0] is %p,the address of a1[1] is %pn”,&a1[0],&a1[1]);

printf(“the &a1[0] is %p,the &a[1] is %pn”,&(&a1)[0],&(&a1)[1]);

p = a1;

p1 = &a1;

}

以上程序中p1,p即我们应该填的,如果编译器编译时没有警告,那么说明我们的这样写法是正确的.

那么在深入下的分析下,p1和p现在都要他访问a1中的第二个元素,即a1[1],应该怎么做那?

大家可以思考下,答案是:

p[1] p1[0][1],如何验证那,只要执行if(p[1] = = p1[0][1]),如果这个逻辑为真,那说明正确.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号