查漏补缺,为2020年春季面试做准备。
问题1:二维数组,如何作为参数传递
问题2:二维数组,如何申请内存空间
问题3:二维数组,申请内存之后,如何释放的。
#include <iostream> using namespace std;
/*传二维数组*/ //第1种方式:传数组,第二维必须标明 /*void display(int arr[][4])*/ void display1(int arr[][4],const int irows) { for (int i=0;i<irows;++i) { for(int j=0;j<4;++j) { cout<<arr[i][j]<<" "; //可以采用parr[i][j] } cout<<endl; } cout<<endl; }
//第2种方式:一重指针,传数组指针,第二维必须标明 /*void display(int (*parr)[4])*/ void display2(int (*parr)[4],const int irows) { for (int i=0;i<irows;++i) { for(int j=0;j<4;++j) { cout<<parr[i][j]<<" "; //可以采用parr[i][j] } cout<<endl; } cout<<endl; } //注意:parr[i]等价于*(parr+i),一维数组和二维数组都适用
//第3种方式:传指针,不管是几维数组都把他看成是指针 /*void display3(int *arr)*/ void display3(int *arr,const int irows,const int icols) { for(int i=0;i<irows;++i) { for(int j=0;j<icols;++j) {
////请注意。。这种读取方式,只适合静态二维数组,不适合动态分配的二维数组。动态分的二维数组,一行内是连续地址,但是每一行之间并不连续。。。 cout<<*(arr+i*icols+j)<<" "; //注意:(arr+i*icols+j),不是(arr+i*irows+j) } cout<<endl; } cout<<endl; }
int main() { int arr[][4]={0,1,2,3,4,5,6,7,8,9,10,11}; int irows=3; int icols=4; display1(arr,irows); display2(arr,irows); //注意(int*)强制转换.个人理解:相当于将a拉成了一维数组处理。 display3((int*)arr,irows,icols); return 0; }
二维数组,申请内存空间,和释放内存空间问题:
int** copyPath =new int*[rows]; for (int i = 0; i < rows; i++) { copyPath[i] = new int[cols]; } for (int i = 0; i < rows; i++) { delete[] copyPath[i]; } delete[] copyPath; /////直接声明的方式 int arrPath[4][4] = { { 1, 3, 5, 9 }, { 8, 1, 3, 4 }, { 5, 0, 6, 1 }, { 8, 8, 4, 0 } };
二维数组,作为参数传递和访问的正确操作方法。
void VisitDynamicArr2(int **num , int rows, int cols) 这里使用int **作为参数来传递动态的二维数组。
分为静态二维数组和动态二维数组两种形式。
///////////////////////二维静态数组 void VisitStaticArr1(int **num, int rows,int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // cout << num[i][j] << endl; //ERROR... ////这种方式只适合静态的连续的内存空间。。动态分配的二维数组,(一行内是连续的)但是,每一行并不是连续的。 cout << *((int*)num + i*cols + j)<<", "; } cout << endl; } cout << endl; } void testArr1() { int num[4][5];//静态的 int iCount = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { num[i][j] = iCount; iCount++; } } VisitStaticArr1((int**)num, 4, 5); //OK // VisitStaticArr1(num, 4, 5); //ERROR.Not OK..无法将参数 1 从“int [4][5]”转换为“int **” }
//////////////////////二维动态数组 void VisitDynamicArr2(int **num , int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { cout << num[i][j] << ", "; } cout << endl; } cout << endl; } void TestArr2() { int rows = 4; int cols = 5; //动态申请内存空间 int **num = new int*[rows]; for (int i = 0; i < rows; i++) { //每一行的内存空间和上一行不一定连续 num[i] = new int[cols]; } //赋初值 int iCount = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { num[i][j] = iCount; iCount++; } } VisitDynamicArr2(num, rows, cols);//OK VisitDynamicArr2((int **)num, rows, cols);//OK ///释放资源 for (int i = 0; i < rows; i++) { delete[] num[i]; } delete[] num; }