二维数组及多维数组本质上还是线性的数据存储结构,因为内存在本质上就只是线性结构,二维数组转一维数组时,只需要考虑两者的下标对应关系就可以了。
数组名会被编译器处理为指针常量,二维数组可以理解为数组的数组,但却无法用一个二级指针来引用它,因为二级指针无法包含行、列的维度信息,变通的方法就是用一个数组指针来指向它。
以下内容实现的细节见下面的实例:
#include <iostream> using namespace std; void main() { int i,j,k; const int row=4; const int col=5; const int rc=20; int a[row][col],b[rc]; for(i=0;i<row;++i) // 二维数组赋值 for(j=0;j<col;++j) a[i][j]=(i+1)*10+(j+1); for(i=0;i<row;++i) // 二维数组输出 { for(j=0;j<col;++j) cout<<a[i][j]<<" "; if(j%col==0) cout<<endl; } for(i=0;i<row;++i) // 用二维数组给一维数组赋值 for(j=0;j<col;++j) { k=i*col+j; // 注意一维数组与二维数组下标的关系 b[k]=a[i][j]; } for(k=0;k<rc;++k) // 一维数组输出 { cout<<b[k]<<" "; if((k+1)%col==0) cout<<endl; } int(*pa)[col]; pa=a; //a已退化为指针常量 //int **pa; //pa=a;//cannot convert from 'int [4][5]' to 'int ** ' for(i=0;i<row;++i) // 二维数组用数组指针输出 { for(j=0;j<col;++j) cout<<*(*(pa+i)+j)<<" "; if(j%col==0) cout<<endl; } system("pause"); } /* 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 42 43 44 45 */
-End-