原理:二级指针,行指针+列指针
?照着葫芦画瓢就行。
方法一:用c语言malloc实现
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
//二维数组的动态内存申请,采用子函数的方式 为二级指针申请内存,和释放内存
int** creatArray2D(int row, int col)
{
//int *p=(int*)malloc(sizeof(int)*4)
int** p1 = (int**)malloc(sizeof(int*) * row);//申请了三个一级指针(也就是行指针)
if (p1 == NULL)
{
return NULL;
}
for (int i = 0; i <col; i++)
{
p1[i] = (int*)malloc(sizeof(int) *col);
}
return p1;
}
int main()
{
int** array = creatArray2D(3, 4);
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
array[i][j] = i + j;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d\t",array[i][j]);
}
printf("\n");
}
free(array);
return 0;
}
方法二:用数组指针实现
int main()
{
//数组指针,指向int【4】的一个指针
int(*p)[4] = (int(*) [4])malloc(sizeof(int[4]) * 3);//Malloc前面的是强制类型转化->三行四列
//一步到位
if (p == NULL)
return NULL;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d\t", p[i][j] = i + j);
}
printf("\n");
}
return 0;
}
这样写虽然可以一步到位,但是优缺点:列数是一开始就固定好了?
方法三:用C++实现(new和delete)
#include<iostream>
#include<string>
using namespace std;
void creatArray2D(int**&p,int row,int col)
{
p = new int* [row];
for (int i = 0; i < row; i++)
{
p[i] = new int[col];
}
}
void testArr(int**& p, int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
p[i][j] = i + j;
cout << p[i][j]<<"\t";
}
cout << endl;
}
}
void freeArr(int**& p, int row, int col)
{
for (int i = 0; i < row; i++)
{
delete[]p[i];
p[i] = nullptr;
}
delete[]p;
p = nullptr;
}
int main()
{
int** p = nullptr;
creatArray2D(p, 3, 3);
testArr(p, 3, 3);
freeArr(p, 3, 3);
return 0;
}
//new可以理解为类型降一级。
当然不用&,那么可以用c语言传统的传地址。(原理同)
void creatArray(int*** p, int row, int col)
{
*p = new int* [row];
for (int i = 0; i < row; i++)
{
(*p)[i] = new int[col];
//注意此处不能写成 *p[i]=new int[col];优先级问题
//此处相当于了对p[i]解引用,我们原本的意图是先化p为二级指针,再[]调成行列指针
}
}
注意最后一行代码的优先级问题。?
?
|