这里简单介绍动态二维数组的开辟与释放,以及二维数组传参的几种方法
动态二维数组的开辟与释放
方法1:直接开辟一维数组
eg: int *p = new int[10*10];//当成一维数组进行开辟
访问数据的方式 :通过a[i*10+j] 来访问第(i*10+j)个数据。
优缺点:访问数据很方便,且new的次数少,释放空间容易,但是不便于理解,且使用时需要转化。
void Test()
{
int *p = new int[10*10];//直接开辟一维数组
//初始化
for(size_t i=0; i<10; i++)
{
for(size_t j=0; j<10; j++)
{
p[i*10+j] = i*j; //通过a[i*10+j]来访问第(i*10+j)个数据
}
}
//访问数据
for(size_t i=0; i<10; i++)
{
for(size_t j=0; j<10; j++)
{
cout<<p[i*10+j]<<" "; //通过a[i*10+j]来访问第(i*10+j)个数据
}
cout<<endl;
}
delete[] p; //释放
}
方法2:一维指针数组。(指针数组+一维指针) eg: int** maze = new int*[M]; for(int i=0; i<M; i++)
{
maze[i] = new int[N];
}
访问数据的方式:直接通过a[i][j]访问第i行第j列的数据。
优缺点:通过a[i][j]访问数据容易,但new的次数太多释放空间不容易。
void Test()
{
//开辟空间
int ** p = new int*[10];
for(size_t i=0; i<10; i++)
{
p[i] = new int[10];
}
//访问通过p[i][j]访问
for(size_t i=0; i<10; i++)
{
for(size_t j=0; j<10; j++)
{
p[i][j] = i*j;
cout<<p[i][j]<<" ";
}
cout<<endl;
}
//释放
for(size_t i=0; i<10; i++)
{
delete[] p[i];
}
delete[] p;
}
二维数组的传参方法
方法1:形参为二维数组并给定第二维的长度
形参: maze[][5] ----- 实参: maze
void InitAPrint(int p[][10]) //形参辟[][10]
{
//访问通过p[i][j]访问
for(size_t i=0; i<10; i++)
{
for(size_t j=0; j<10; j++)
{
p[i][j] = i*j;
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
void Test()
{
int arr[10][10];
InitAPrint(arr); //实参arr
}
方法2: 形参为指向数组的指针并给出数组的长度 形参:(*maze)[5] ---- 实参:maze
void InitAPrint(int(*p)[10]) //形参辟(*)p[10]
{
//访问通过p[i][j]访问
for(size_t i=0; i<10; i++)
{
for(size_t j=0; j<10; j++)
{
p[i][j] = i*j;
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
void Test()
{
int arr[10][10];
InitAPrint(arr); //实参arr
}
这里仅列出两种传参方法,更多方法详见:https://blog.youkuaiyun.com/gqb_driver/article/details/8886687