指向指针的指针和二维数组结合,申请、释放内存空间很是不好理解,理解了好大一会,才搞明白,把分析结果记录下来。
1、下图是存储关系,帮助大家分析理解:
2、以下是源代码,加了足够的注释:
#include <iostream>
using namespace std;
int main()
{
int **p;
int i,j; //p[4][8],4行8列的二维数据
// 申请大小为4的**指针**数组(p指向这个数组的起始位置),将来存储的是4个8列数组的起始地址。
p = new int *[4];
for(i = 0; i < 4; i++) {
// 申请大小为8的数组,(一维数组p[i]分别指向这个数组的起始位置)
p[i] = new int [8];
}
// 给4行8列数组设定初期值
for(i = 0; i < 4; i++) {
for(j = 0; j < 8; j++){
p[i][j] = j * i;
}
}
// 打印数据
for(i = 0; i < 4; i++) {
for(j = 0; j < 8; j++) {
// 分4行打印
if(j == 0) cout << endl;
// 每打印一个用制表符分开
cout<< p[i][j] << "\t";
}
}
// 开始释放申请的堆
for(i = 0; i < 4; i++){
// 释放4个8列数组的内存堆
delete [] p[i];
}
// 释放4个数组的堆
delete [] p;
return 0;
}