天天看点

如何传递三维数组乃至n维数组

在此之前,提一下二维数组的常用传递方法:

1.传递时提及第二维度:arr[][size2];

void func(int arr[]]){
    arr]];
}
int main(){
    int arr]];
    func(arr);
}
           

2.“假装”成一维数组

void func(int* arr, int s1, int s2){
    arr(s2 +); //相当于arr[3][4]=34,
}
int main(){
    int arr]];
    func( (int*)arr,,);
}
           

为什么要使用第二个维度,而不是第一个呢?

想一下,由两个维度摊开成一个面,从上到下从左到右数,第4行(行标是3)第5列(列标是4)是第几个元素怎么算?

应该是前3行每行6个元素,加上第四行的5个元素,即3*6+5=23(作为一位数组的下标是22)。

因此在这里,只需知道第二维度,而第一维度who care?

这也是方法一不需要第一维度的原因,两者其实是相同的原理。

三维数组:

与前面一样,懂了原理就知道,需要知晓后两个维度(n维数组需提供后面n-1个维度)

1. 按arr[][size2][size3]传递

2.还是“假装”成一维数组

void func(int* arr, int s1, int s2, int s3){
    arr(s2*s3*3 + s3*4 + )=; //相当于arr[][][]=,
}
int main(){
    int arr[][][];
    func( (int*)arr, , , );
}
           

行和列形成一个面,多层面形成三维图形,维度顺序是层、行、列

前3层共有多少个元素,当然是6*7*3个了,所以需知晓第二、第三维度。

3.先在全局作用域设置一个类型别名

typedef int mytype[5][6][7];
           

然后就可以将mytype当成int[5][6][7]进行传递

void func(mytype arr){
    arr[][][]=;
}
void main(){
    mytype arr; //相当于int arr[5][6][7]
    func(arr);
}
           

这,好像就是看起来简约了一点,但其实,emmm,作用确实不大,只是便于封装。。。

只要理解了原理,妈妈再也不用担心我传数组啦!不管几维数组都能传。

继续阅读