Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356365
  • 博文数量: 197
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 303
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 14:21
文章分类

全部博文(197)

文章存档

2014年(89)

2013年(108)

我的朋友

分类: C/C++

2013-11-01 13:55:51

记住一点,数组名是数组元素的首地址,或说是数组的第一个元素的首地址,而数组的首地址是&数组名。

 

举例来说,

int a[5] = {0};

 int *p ;

 

p是指向整形变量的指针,p=a;意思就是将数组元素第一个元素首地址送到p中。&a呢?这个是指向整形数组的指针。那么我们就要定义一个指向整形数组的指针。   

int(*p1)[5] = &a;(到目前为止见的不多,写在这,加以深刻的理解)

5代表这个数组每个元素都有5个整形变量,似乎这上升到二维数组了。是这样的,现在编译器常把&a认为是比a高一级的数组,但是地址和a一样~~~

 

那么二维数组呢

 

定义了 int b[5][5];

我们首先要明白二维数组在内存的布局(不懂可以查阅一下)

二维数组实际上不存在的,是有数组的数组,即数组嵌套一个数组来表示的。

那么结合之前我们对一维数组的理解,b[0]就表示被嵌套的一维数组元素的首地址,所以可以定义

int * p1 = b[0];

来指向它~~~b[0]+1就表示b[0][1]的地址。*(b[0] + 1);也可以写成

*(*b+1);

 

接着2维数组的问题,还是和上面一维数组相关的~~~

 

int(*pt)[5];

那么 pt = b ;这里的b是二维数组名,与上面我们讨论的&a是一类的,也就是说与&b[0]是一类的~~~也就是说b + 3 &b[0] +3 是一回事~~

事实上,pt指向的也是数组首元素的地址,因为这个数组元素的类型时有5个元素

每个元素都是数组类型,所以将其定义为int (*pt)[5];

 

 

 

要记住传参时或用数组指向时是这样一个关系

      数组参数                                       等效的指针参数

数组      原型声明char a[10]     (传的是a)             指针    char * p
数组的数组:      char a[3][4]   (传的是a)            数组的指针:char (*p)[4]
指针数组:        char *a[5]      (传的是a)            指针的指针:char **p

阅读(808) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~