二维数组、指针数组、行指针、二级指针间的关联
2016-04-17 18:34
330 查看
二维数组、指针数组、二级指针、行指针互转
定义一个一维数组int a[10],其内存结构如图:
图1
在中括号[]之前的a表示数组的首地址,a+i则表示第i个int型数据的地址,通过*解引用,来索引具体的数据。
图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蓝色虚线框内。
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]来索引具体元素的值,实际上就是起到将二维数组部分(仅访问其中一行,故为部分)转为一维数组的作用。
int b[3] = { 1,2,3};
cout << *((int *)*(&b+ 1)-1)<< endl;//3
验证成功,图解如下图3。
图3
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
相关文章推荐
- 关于指针的一些事情
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- Lua中使用二维数组实例
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C# Pointer指针应用实例简述
- C语言内存对齐实例详解
- C++智能指针实例详解
- 深入学习C语言中memset()函数的用法
- C++指向函数的指针实例解析
- 关于c语言指针的两处小tip分享
- 浅析iterator与指针的区别
- 探讨C++中数组名与指针的用法比较分析
- C++编程指向成员的指针以及this指针的基本使用指南
- 详解C++中的指针、数组指针与函数指针
- C++中字符串以及数组和指针的互相使用讲解