堆中创建二维数组:
方法一:
当使用new运算符定义一个多维数组变量或数组对象时,它产生一个指向数组第一个元素的指针。
左边的意思是声明了一个数组指针,该指针指向一个数组,如int (*p)[2]的意思为声明一个指针p指向一个长度为2的数组,该数组的元素类型为int。int(*p)[2] = new int[3][2];这里p指针指向的长度为2的数组,如果你把p指针加1后输出p指针会发现其结果为地址,且输出的地址加了8个字节,也就是跳过了2个int类型的数据,其实此时是指针p由指向二维数组的[0][0]变为指向[1][0]再变为指向[2][0],所以个人理解是该指针就是指向二维数组每一行的指针,指针加1即指向了数组的下一行。
要想求作为为[i][j]的值,有两种方法:
1、先p+i让指针p指向第二维数组第i行,解引用*p(因为p指向的是数组,解引用不能直接输出数组,而会得到该行一维数组的首地址)得到该行一维数组的首地址,定义指针q(int *q)来接收*p,然后q+j使指针指向我们要定位的坐标,最后*q求得该坐标的值
2、直接cout<<p[i][j]<<endl; 推荐使用第二种方法 简单一些
示例代码:
#include<iostream>
using namespace std;
int main()
{
int *a = new int[34];
int (*c)[2] = new int[34][2];
int (*e)[2][2] = new int[34][2][2];
cout<< "*****************a****************" <<endl;
cout<<a<<endl;
cout<<&a[0]<<endl;
cout<<a+1<<endl;
cout<<&a[1]<<endl;
cout<< "*****************c****************" <<endl;
cout<<c<<endl;
cout<<&c[0][0]<<endl;
cout<<c+1<<endl;
cout<<&c[1][0]<<endl;
cout<<(*(c)+1)<<endl;//方法一输出[i][j]的值
cout<<&c[0][1]<<endl;
cout<< "*****************e****************" <<endl;
cout<<e<<endl;
cout<<&e[0][0][0]<<endl;
cout<<((*(*e))+1)<<endl;//方法一输出[i][j][k]的值
cout<<&e[0][0][1]<<endl;
cout<<e+1<<endl;
cout<<&e[1][0][0]<<endl;
cout<< "****************delet*****************" <<endl;
delete[] a;
delete[] c;
delete[] e;
}
运行结果:
方法二:
主要代码:
unsigned int **dist = new unsigned int *[5]; //使用二级指针指向一维数组的首地址
//dist[0] = new unsigned int [5*5]; //dist的一级指针指向有25个元素的一维数组,保证最终创建出来的结果是一个下标可访问的5维方阵
//或者这样也行
*dist = new unsigned int [5*5]; //
for(int i = 1; i < 5; i++)
{
dist[i] = dist[i-1] + 5; //指定二维数组每一行的首地址为上个首地址的地址偏移
}
示例代码:
#include<iostream>
#include <strstream>
using namespace std;
template <class T>
void PrintMatrix(T **m, int l, int h)
{
int LOG_BUF_lEN = 1024;
char buf[LOG_BUF_lEN];
ostrstream strout(buf, LOG_BUF_lEN);
strout << endl;
strout << "*********** Matrix(l:" << l << ", h:" << h << ") **********\n";
for(int i = 0; i < h; i++)
{
for(int j = 0; j < l; j++)
{
strout << m[i][j] << " ";
}
strout << endl;
}
strout << ends;
buf[LOG_BUF_lEN - 1] = '\0';
cout<<buf;
}
int main()
{
unsigned int **dist = new unsigned int *[5]; //使用二级指针指向一维数组的首地址
//dist[0] = new unsigned int [5*5]; //dist的一级指针指向有25个元素的一维数组,保证最终创建出来的结果是一个下标可访问的5维方阵
//或者这样也行
*dist = new unsigned int [5*5]; //
for(int i = 1; i < 5; i++)
{
dist[i] = dist[i-1] + 5; //指定二维数组每一行的首地址为上个首地址的地址偏移
}
//初始化
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(i != j)
dist[i][j] = 0;
else
dist[i][j] = 6;
}
}
PrintMatrix(dist, 5, 5);
}
参考:
https://blog.youkuaiyun.com/qq_42518941/article/details/109322467