#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; }