C++函数参数


如何传递高维数组

#include <algorithm>
#include <iostream>
 
// 思路1:直接传递1维指针
// 因为高维数组也是按照1维的方式进行存储的,指针都是连续的,下标自己计算
void f1(int d1, int d2, int *d, int x, int y)
{
    std::cout << (d + d2 * x + y) << std::endl;
}
 
// 思路2:直接指定数组大小,数组大小是常数
// 内部就直接当作正常数组来使用
void f2(int d1, int d2, int d[3][3], int x, int y)
{
    // 从输出的地址来看,并没有创建新的数组并复制数据的过程
    // 参数还是当作指针来传递的
    std::cout << &(d[x][y]) << std::endl;
}
 
// 思路3:和思路2类似,但是第1维的大小可以省略,注意后面都不可以省略
void f3(int d1, int d2, int d[][3], int x, int y)
{
    std::cout << &(d[x][y]) << std::endl;
}
 
// C99 标准引入了变长数组(Variable Length Arrays, VLA)
// C支持,C++不支持(第一次见到C支持,C++不支持的特性)
// void f4(int d1, int d2, int d[d1][d2], int x, int y);
 
// 其他方法
// 1. 使用结构体封装高维数组,需要注意不要按值传递参数,否则数组元素会发生复制,用指针或者引用
// 2. 使用vector
 
int main()
{
    // 一个普通的二维数组
    int d[3][3] = {{1,2,3}, {4,5,6}, {7,8,9}};
 
    std::cout << &(d[0][0]) << std::endl;
    f1(3, 3, (int*)d, 0, 1); // 指针类型需要强转,d本来是int**
    f2(3, 3, d, 0, 2);
    f3(3, 3, d, 1, 0);
 
    return 0;
}