二维数组的传递有许多易忘点,也伴随着许多陷阱,没避开的话总会让编译器抱怨。
闲来无事,为日后莫忘,便整理此笔记。
法 1: 传递带列数的二维数组。
1 const int row = 2; 2 const int col = 3; 3 4 int matrix[][col] = { {0,1,2},{3,4,5} }; 5 6 void display(int matrix[][col]) 7 { 8 for( int i = 0; i != row; i++ ) 9 { 10 for( int j = 0; j != col; j++ ) 11 { 12 cout<<matrix[i][j]<<" "; 13 } 14 cout<<endl; 15 } 16 }
法 2: 传递一维指针和数组的列数
1 void display(int* matrix,int col) 2 { 3 for( int i = 0; i != row; i++ ) 4 { 5 for( int j = 0; j != col; j++ ) 6 { 7 cout<<*(matrix+i*col+j)<<" "; 8 } 9 cout<<endl; 10 } 11 } 12 13 int main() 14 { 15 display(matrix[0],col); //display(&matrix[0][0],col); 16 return 0; 17 }
法 3:传递指向数组的指针
1 void display(int (*matrix)[col]) 2 { 3 for( int i = 0; i != row; i++ ) 4 { 5 for( int j = 0; j != col; j++ ) 6 { 7 cout<<*(*(matrix+i)+j)<<" "; 8 } 9 cout<<endl; 10 } 11 } 12 13 int main() 14 { 15 display(matrix); //二维数组名传递二维数组的首地址( 指向数组长度为col的指针 int(*)[3] ) 16 return 0; 17 }
实际上,这三种方式并无多大区别。
都可以理解成一个指向固定长度数组的一维指针。
e.g. int *matrix -> [0,0] [0,1] [0,2] ...... 当行数为2时,依次解引获取地址里的内容。 实际上数组开辟的内存是连续排列的。这就解释了法2中 ‘ cout<<*(matrix+i*col+j)<<" "; ’的解引方式了。
基本知识应该不难掌握。
现在让我们来做一些有趣的事情~
拓展 1:
1 typedef int matrixType[row][col]; //定义一个 2 * 3 的矩阵类型 2 3 matrixType myMatrix = { {0,1,2},{3,4,5} }; 4 5 void display(matrixType* myMatrix) //指向矩阵类型的指针 6 { 7 for( int i = 0; i != row; i++ ) 8 { 9 for( int j = 0; j != col; j++ ) 10 { 11 cout<<*(*(matrix+i)+j)<<" "; 12 } 13 cout<<endl; 14 } 15 } 16 17 int main() 18 { 19 display(&myMatrix); 20 return 0; 21 }
再看看另一种定义二维数组的方式。
拓展 2:
1 typedef int colType[col]; //colType是数组长度为 col 的一维数组(指针)类型 2 typedef colType matrixType[row]; //matrixType是 row * col 的二维数组类型 3 4 matrixType myMatrix = { {0,1,2},{3,4,5} }; 5 6 void display(colType* myMatrix) //等价于 int (*matrix)[col] 7 { 8 for( int i = 0; i != row; i++ ) 9 { 10 for( int j = 0; j != col; j++ ) 11 { 12 cout<<*(*(matrix+i)+j)<<" "; 13 } 14 cout<<endl; 15 } 16 } 17 18 int main() 19 { 20 colType* matrix_ptr = myMatrix; 21 display(matrix_ptr); //display(myMatrix); 22 return 0; 23 }
以上都是静态二维数组传递方式。
附加上动态开辟二维数组的方法。
拓展 3:
1 int main() 2 { 3 int** arr_2D; 4 int row = 2; //可用cin获得 5 int col = 3; 6 7 arr_2D = (int**)malloc(row*sizeof(int*));//arr_2D = new int*(row); 8 9 for( int i = 0; i != row; i++ ) 10 {// 开辟行内存 11 *(arr_2D+i) = (int*)malloc(col*sizeof(int)); 12 } 13 14 for( int i = 0; i != row; i++ ) 15 { 16 for( int j = 0; j != col; j++ ) 17 { 18 cin>>arr_2D[i][j]; 19 } 20 } 21 22 for( int i = 0; i != row; i++ ) 23 { 24 for( int j = 0; j != col; j++ ) 25 { 26 cout<<arr_2D[i][j]<<" "; 27 } 28 } 29 30 for( int i = row-1; i >=0; i-- ) 31 { 32 free(arr_2D[i]); 33 } 34 free(arr_2D); 35 return 0; 36 }
二维数组的开辟是先开辟行内存,再开辟列内存。释放时顺序相反,先释放列内存,再释放行内存。
具体可参考大神的解析~ http://blog.csdn.net/morewindows/article/details/7664479
时间: 2024-11-05 17:30:48