C++: 二维数组作函数参数

来源:互联网 发布:知乎专栏稿费 编辑:程序博客网 时间:2024/06/05 22:36

有两种类型的二维数组:

维数固定

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

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

下面的代码是错误的:

[cpp] view plaincopyprint?
  1. int ** p= ia;//ia的类型是char (*)[2],而不是**int  

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

动态数组

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

[cpp] view plaincopyprint?
  1. int   **p   =   new   int*[2];         //只有每行内是连续排列,各行并不一定连续排列   
  2. for   (   int   i   =   0;   i   <   2;   i++   )   
  3. {   
  4.     p[i]   =   new   int[2];   
  5. }   
  6. for   (   int   i   =   0;   i   <   2;   i++   )   
  7. {   
  8.     for   (   int   j   =   0;   j   <   2;   j++   )   
  9.     {   
  10.         p[i][j]   =   ia[i][j];   
  11.     }   
  12. }  

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

[cpp] view plaincopyprint?
  1. void f(int **p , int row, int col )  
  2. {  
  3.     for(int i = 0; i < row; i++)  
  4.     {  
  5.         for(int j =0 ;j < col; j++)  
  6.         {  
  7.             cout<<p[i][j]<<" ";  
  8.         }  
  9.     }  
  10.     cout<<endl;  
  11. }  

变量在作用域里面被声明的是什么类型,就当作什么类型来用。

(1)参数是二维数组,但是要指定第二维的维数。

int array[10][10];

函数声明:void fuc(int a[][10]);

函数调用:fuc(array);

——在函数fuc中,a是二维数组。使用a[i][j]形式来访问数组中元素。

(2)参数使用一维指针数组。

int *array[10];

for(i = 0; i < 10; i++)

    array[i] = new int[10];

函数声明:void fuc(int *a[10]);

函数调用:fuc(array);

——在函数fuc中,a是一维指针数组。使用*(a[i] + j)形式来访问数组中元素。

(3)参数使用指针的指针。

int **array;

array = new int *[10];

for(i = 0; i <10; i++)

    array[i] = new int[10];

函数声明:void fuc(int **a);

函数调用:fuc(array);

——在函数fuc中, a是指针的指针。使用*(int *)(a + i*d2 + j)形式来访问数组中元素。其中:

a[0]<=>array[0][0],

a[1]<=>array[0][1],

a[10]<=>array[1][0]

注:d2为二维数组的二维维数,即列数。并且a + i*d2 + j为地址,所以要把这个类型为指针的指针的地址强制转换为指针来使用。

0 0