在上一章中, 介绍了指针与一维数组的联系 (指针数组叫动态数组)
一维数组搞定了, 二维数组? 能否按照一维数组的思路?------可以
例:
#include <iostream>
using namespace std;
int main()
{
int num[3][3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cin>>num[i][j];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
cout<<num[i][j]<<' ';
cout<<endl;
}
return 0;
}
其内存状态如下, 看不懂看这里:

现在问题是, 出现了3个指针, 如何将其融合于一个指针之中呢?
其实上想一想就知道, 就是双重指针 ( ** )
好, 现在我们已经有了一个申请列的空间的雏形:
#include <iostream>
using namespace std;
int main()
{
int **num=new int*[3];//申请3个指针空间(给列用, 3个列)
return 0;
}
现在内存状态如下:

现在问题又来了: 如何申请行的空间?
这也不难, 想一下, num[0], num[1], num[2] 都是指针, 而指针怎么再开辟空间, 不是又回到了一维数组指针了吗?
只要循环遍历一下列数, 在每个列指针后开辟一串n行的一维数组
#include <iostream>
using namespace std;
int main()
{
int **num=new int*[3];
for(int i=0;i<3;i++)
num[i]=new int[3];
return 0;
}
现在还有一个小问题, 释放内存如何释放?
先删除开辟的行, 再删除列
#include <iostream>
using namespace std;
int main()
{
int **num=new int*[3];
for(int i=0;i<3;i++)
num[i]=new int[3];
for(int i=0;i<3;i++)
delete[] num[i];
delete[] num;
return 0;
}
以下给出两种二维数组指针访问方式, 两种方式等效:
1. 指针访问 (根据矩阵行列表示的原理):
#include <iostream>
using namespace std;
int main()
{
int **num=new int*[3];
for(int i=0;i<3;i++)
num[i]=new int[3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cin>>*(*(num+i)+j);
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
cout<<*(*(num+i)+j)<<' ';
cout<<endl;
}
for(int i=0;i<3;i++)
delete[] num[i];
delete[] num;
return 0;
}
2.常规访问:
#include <iostream>
using namespace std;
int main()
{
int **num=new int*[3];
for(int i=0;i<3;i++)
num[i]=new int[3];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cin>>num[i][j];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
cout<<num[i][j]<<' ';
cout<<endl;
}
for(int i=0;i<3;i++)
delete[] num[i];
delete[] num;
return 0;
}
二维数组在难度上有所提高, 多维数组以此类推, 需要好好理解