C/C++ 二维数组作为函数参数

来源:互联网 发布:mac本地文件夹在哪里 编辑:程序博客网 时间:2024/06/06 22:07

有两种类型的二维数组:

维数固定

这一类的数组存放在栈上,是连续存储的。任意维度固定的多维数组都可以看做是一维数组,可以用a[i+j*n]的形式来访问。

int ia[2][2] = {2,3,4,5}; //4个元素时连续排列的内存段//void f(int p[][2], int row, int col )//这种方式必须事先知道除第一维以外的维度的大小,不灵活void f(int *p , int row, int col )//转化为一维数组来访问{for(int i = 0; i < row; i++){for(int j =0 ;j < col; j++){cout<<p[i*col+j]<<" ";}}cout<<endl;}

下面的代码是错误的:

int ** p= ia;//ia的类型是char (*)[2],而不是**int

这是因为,**p指向首地址,因为int   **p一次解引用为地址指针,而非堆上的指向数组的指针,所以二次解引用会出错。 

动态数组

这类数组存放在堆上。只有每行内是连续排列,各行并不一定连续排列。

int   **p   =   new   int*[2];         //只有每行内是连续排列,各行并不一定连续排列 for   (   int   i   =   0;   i   <   2;   i++   ) { p[i]   =   new   int[2]; } for   (   int   i   =   0;   i   <   2;   i++   ) { for   (   int   j   =   0;   j   <   2;   j++   ) { p[i][j]   =   ia[i][j]; } }

这类数组的访问,可以传递多维指针(这里是二维**p)和维度,直接用a[i][j]访问。

void f(int **p , int row, int col ){for(int i = 0; i < row; i++){for(int j =0 ;j < col; j++){cout<<p[i][j]<<" ";}}cout<<endl;}


原创粉丝点击