这里简单介绍动态二维数组的开辟与释放,以及二维数组传参的几种方法
动态二维数组的开辟与释放
方法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.csdn.net/gqb_driver/article/details/8886687