Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37225
  • 博文数量: 5
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 47
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-25 10:32
文章分类
文章存档

2014年(5)

我的朋友

分类: C/C++

2014-03-19 19:25:26

最近在准备面试的题目,看到指针和数组部分,纠结得很,在了解typedef的过程中,看见了数组指针,看着晕晕乎乎的,就像桥几行代码熟悉下,加深自己的了解。好了,切入正题。

         int (*pa)[3] ; //这里我定义了一个数组指针

网上有很多教程教我们如何去读这样的指针,从*开始看,引起我注意的是括号,(*pa),显示这里pa就是代表着一个指针,而(*pa)后面接着一个数组的标志’[]’,所以pa的含义就是:“指向一个含有3int类型的数组”,简称数组指针,这里为什么不叫指针数组呢?我个人的了解是,我们中国人喜欢把重点放在后面说,前面说的都是无关紧要的东西,就像我们那会写作文那样,什么“画龙点睛”之类的手笔。西方人就喜欢把重要的东西放在前面,后面都是一些什么修辞,比如,我们在做英文阅读的时候,老师就说了,文章的中心句不在首段,就在第二段的首句,很少在第二句。当然这都是我自己的理解,希望不要误解大家。

         那么数组指针的是干什么用的呢,它可不是面试官拿来刻意刁难应聘者的。数组指针可以用来指向二维数组,在遍历二维数组的时候,我们就没有必要使用两层循环来打印二维数组了,这样时间复杂度是不是就简化了呢?

         我们以前在书上看见二维数组的声明: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了。

 

好了,写段测试代码测试一下,加深自己的了解:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a[2][3] = {{1,2,3} ,{4,5,6}} ;

  5.     int (*pa)[3] ; //定义一个数组指针

  6.     pa = a ; //数组指针指向二维数组

  7.     int i = 0 ;
  8.     //打印第一行数据
  9.     for( i= 0 ;i < 3 ;i++)
  10.     {
  11.         printf("%d\t",*(*pa+i)) ;
  12.     }
  13.     
  14.     printf("\n") ;
  15.     
  16.     pa++ ; //数组指针指向二维数组的第二行
  17.     //打印a[1][2]
  18.     printf("a[1][2] = ") ;
  19.     printf("%d\n" ,*(*pa + 2) ) ;
  20.     printf("\n") ;

  21.     return 0 ;
  22. }



阅读(4272) | 评论(0) | 转发(2) |
0

上一篇:没有了

下一篇:段错误与总线错误

给主人留下些什么吧!~~