首页 > 技术文章 > 函数形参为二维数组

Sunshine--Lin 2015-11-26 15:03 原文

二维数组类型

二维数组可以看成是:一个一维数组,它的每个元素均为一维数组。

例如:int arr[3][4],可以看成是arr[3]内每个元素均为int型长度为4的数组。

 

二维数组作为形参

当定义为:int arr[3][4];时,数组名arr是指向长度为4的一维数组的指针,arr的类型是int (*)[4]。类型中包含了第二维的长度,使用时arr[i][j],则解引用成*(arr+i*4+j)。而当二维数组名作为实参传递给函数时,会自动退化成指针,因此,实际上对应的形参的类型应该为int (*)[4]。

例如:

void func(int (*arr)[4], int arrLen1, int arrLen2){
    for(int i=0; i<arrLen1; i++)
        for(int j=0; j<arrLen2; j++)
            arr[i][j]=i*j;
}

int main(){
    int arr[3][4];
    func(arr, 3, 4);
    return 0;
}

我们在传递一个二维数组时,有如下几种方式:

int arr[3][4];
// arrptr1为指向长度为4的int型数组的指针,(arrptr2 + 1) = arrptr2 + sizeof(int)*4
int (*arrptr1)[4] = arr;
// 强制类型转化为(int **)类型,此时因为编译器不知道二维的长度,不能使用下标运算符"[]"来调用其中元素,(arrptr2 + 1) = arrptr2 + sizeof(int)
int **arrptr2 = (int **)arr; 

  

推荐阅读