2D Array and double pointer

来源:互联网 发布:淘宝上怎么找外卖 编辑:程序博客网 时间:2024/06/07 13:32

首先, 在理解这两个概念之前, 我们看这两个单词的含义。

2D array:二维数组, 例如一个大小为2x3, 各元素类型为int 的二维数组, 定义如下:

int A[2][3];
一个m x n ,int类型的二维数组 A 所占的内存大小为 m x n x sizeof(int) bytes。其中sizeof(int) 根据不同的计算机编译器, 分配的int的大小是不同的。 例如对与一般的计算机, 一个int 占用的内存为4 bytes。 

这样, 上面定义的int 类型的二维数组A[2][3]所占用的内存大小为: 2 x 3 x 4 = 24 bytes。

访问二维数组方式是使用索引(index)。 行下标和列下标均是从0 开始的。 例如 A[i][j] 就是访问第 i+1 行, 第j +1列的元素。 其中i = 0, 1,..., m-1, j = 0, 1, 2, ..., n-1。


数组占用类存的方式是占用一块连续的内存空间用于存储各个元素。 在计算进中, 所以多维数组的存储仍然按照一维数组的方式存储的。

例如,(1) 我们按照如下方式定义一个二维int类型的数组:

#define m 2#define n 3int A[m][n]; // 定义一个2行3列二维整型数组
或者 (2) 我们在定义的时候初始化:

int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
或者(3)直接如下, 定义的时候初始化:

int A[2][3] = {1, 2, 3, 4, 5, 6};//or: int A[][3] = {1, 2, 3, 4, 5, 6};
上述定义的二维数组在内存中的存储方式如下:



存储这个二维数组需要的连续内存块的大小为: 2 x 3 x 4bytes/int = 24bytes。


回顾一下, 声明一个一维数组时:

int A[6];
 数组名A代表的含义就是存储着这个数组的初始地址, 也就是第一个元素A[0]的地址。 当然这个数组名并不完全可以当做一个普通的的指针。 而是被视为一个指向一个内存块(大小为n x 4 bytes)的常数指针(也就是A的内容(即数组第一个元素的地址)不能修改)。  换句话说, A,  A[1], A[2]...等别代表着A[0], A[2]...等对应元素的地址。

我们可以通过使用A[0], A[1], A[3]等下标索引的方式存取数组中的元素, 也可以通过 *(A), *(A + 1), *(A+2)等解参考的方式访问数组对应的元素。


下面我们用指针的方式存取二维数组各个元素:

int A[2][3] = {1, 2, 3, 4, 5, 6};
cout << *(A[0] + 1) << endl; // output 2
cout << *(A[1] + 1) << endl; // output 5

为了理解上述代码, 我们可以将A[0]  想想成第1行的地址,  A[1]为第2行的地址。



这样, A[0][2]就等价于*(A[0] + 2)了(二者都是存取第1行第3列的元素)。

更一般的, A[i][j]等价于*(A[i] + j)。


同时, 我们还应该注意到, A[0] = *A, 所以, 我们也有如下等价方式:

A[i][j] , *(A[i] + j), *(*(A + i) + j) 三者是等价的。

这样, 我们可以说, 如果A是一个二维数组, 那么我们可以将A想象成为“指向指向一个整数的指针的指针”(A pointer to a pointer to an integer), 即 int ** 。解参考*A给出的是第一行的地址(, A[0], 也就是A[]0[0]的地址)。 A[0]是一个int*。

*A[0] 是对A[0]进行解参考, 得到的是A[0][0](即**A 对应 A[0][0])。

double pointers:二级指针。 又称为指向指针的指针(pointer to pointer(a.k.a double pointer))。 类似的还有三级指针等等。

例如声明一个double pointer 如下:

int** doublePtr;// declaration a double pointer doublePtr
doublePtr = new int*; // doubelPtr 在stack 中, 从heap中申请一个指向int无名的指针变量, 返回地址保存于doublePtr中
*doublePtr = new int(3);//从heap 中申请分配一个用于保存int的的内存, 初始化为3, 返回的该地址保存在刚才那个指向无名指针中(在heap 中, 其地址保存在
                        //doublePtr中)。 
.............// processing
delete *doublePtr; // 回收内存
delete doublePtr; // 回收
具体操作如下:

第一步, 分配内存:



最后回收内存





 








 

0 0
原创粉丝点击