2014年(5)
分类: C/C++
2014-03-19 19:25:26
最近在准备面试的题目,看到指针和数组部分,纠结得很,在了解typedef的过程中,看见了数组指针,看着晕晕乎乎的,就像桥几行代码熟悉下,加深自己的了解。好了,切入正题。
int (*pa)[3] ; //这里我定义了一个数组指针
网上有很多教程教我们如何去读这样的指针,从*开始看,引起我注意的是括号,(*pa),显示这里pa就是代表着一个指针,而(*pa)后面接着一个数组的标志’[]’,所以pa的含义就是:“指向一个含有3个int类型的数组”,简称数组指针,这里为什么不叫指针数组呢?我个人的了解是,我们中国人喜欢把重点放在后面说,前面说的都是无关紧要的东西,就像我们那会写作文那样,什么“画龙点睛”之类的手笔。西方人就喜欢把重要的东西放在前面,后面都是一些什么修辞,比如,我们在做英文阅读的时候,老师就说了,文章的中心句不在首段,就在第二段的首句,很少在第二句。当然这都是我自己的理解,希望不要误解大家。
那么数组指针的是干什么用的呢,它可不是面试官拿来刻意刁难应聘者的。数组指针可以用来指向二维数组,在遍历二维数组的时候,我们就没有必要使用两层循环来打印二维数组了,这样时间复杂度是不是就简化了呢?
我们以前在书上看见二维数组的声明:int a[2][3] ;这个二维数组有三列,当数组指针指向这个数组的时候,实际上二维数组就已经退化成为了一个“一”维数组了,一个大的一维数组,a[0] ,和a[1] ,但是这里a[0]和a[1]里面可不是简单的单个int类型的数据,其实它的里面包含的是一个一维数组,这个一维数组里面有3个int类型的数据。其实在内存中,数组都是紧密的排列中以数组名为起始地址的一段空间里面,没有间隙。
当用一个数组指针指向这个二维数组的时候,p = a ; p 实际就成为了一个行指针:如图所示
现在的问题就是怎么遍历二维数组,也就是说,怎么访问a[0][1] = 2 这个变量,pa = a ,那么pa指向二维数组的起始地址,pa + 1 则表示指向二维数组的第二行,指针加减是要看指针指向的对象类型的,我们来看看指针的类型是什么,指针指向的对象就是:int [3] ,那么pa + 1 ,自然就指向了第二行了。现在问题是如何指向第一行的第一个元素2呢,*(*pa + 1)是不是就OK了。
好了,写段测试代码测试一下,加深自己的了解:
点击(此处)折叠或打开