您的位置:首页 > 其它

二维数组、指针数组、行指针、二级指针间的关联

2016-04-17 18:34 330 查看
二维数组、指针数组、二级指针、行指针互转

1. 一维数组

在讲二维数组之前,先回忆一维数组。
定义一个一维数组int a[10],其内存结构如图:


 
图1
在中括号[]之前的a表示数组的首地址,a+i则表示第i个int型数据的地址,通过*解引用,来索引具体的数据。

2. 二维数组与指针数组、二级指针

 


图2
先有如下定义:
int **q;
int *p[3];
int a[][3] = { 1,2,3,4,5,6,7,8,9 };
p[0] = a[0];
p[1] = a[1];
p[2] = a[2];
q = p;
则可用*(*(p+i)+j)、*(*(q+i)+j)对数组内的每个元素进行索引。
内存结构如上图2蓝色虚线框内。

3. 二维数组与行指针

先有如下定义:
int a[][3] = { 1,2,3,4,5,6,7,8,9 };
int (*p)[3];
一维数组表示数据的数组,而二维数组则表示数组的数组,最外层为一个数组(对应行),内部存储一个一维数组,所有的外\内的数组内的数据都是地址。
二维数组的a表示行指针,通过*a解引用,得到a[0](即*a、&a[0][0]),得到每一行数组元素的首地址,此后索引方式同一维数组,通过a[i]+j来得到每个元素的具体地址。
此处注意a与*a得到的地址实际上是一样的,只是逻辑含义不一样而已。
那么到这里我们已经了解了二维数组的存储结构,此时我们再说行指针是如何使用的,如下:
int (*p)[3];//个数必须同二维数组列元素个数相等
p=a+1;//表示获得第一行首地址(与第一行元素首地址区别,虽然值是一样的,但含义不一样)
*p将a+1向内前进一层,得到第一行元素首地址,然后通过(*p)[i]来索引具体元素的值,实际上就是起到将二维数组部分(仅访问其中一行,故为部分)转为一维数组的作用。

4. 引伸应用

在3中讲了将行指针a通过*a前进一步得到第0行元素首地址,那么思考如果将一维数组的b[3]首地址b取地址&b(即加引用),是不是就得到了对应的行指针,验证:
int b[3] = { 1,2,3};
cout << *((int *)*(&b+ 1)-1)<< endl;//3
验证成功,图解如下图3。
 


图3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二维数组 指针 内存