二维数组作函数参数的三种方式
前言
二维数组作函数参数的本质都是传递数组的首地址,但是具体的写法有3种,例子如下:
void work1(int [][C])
void work2(int (*)[C])
void work3(int *)
讲解
第一种和第二种都可以自动计算索引,也就是可以使用下标[]
去访问数组,而第三种不可以。
第一种
最基本的方法,无需多说,要注意的就是形参名第一维的长度不需指定,但第二维的长度必须指定。
第二种
该方法是通过传递二维数组的行指针实现的,定义行指针的方式如下:
int (*p)[3]
要是不懂的话(懂得二维数组的行指针和列指针)自己去工具书里重修一下或者去其他地方搜。
第三种
这就是直接当一维数组传一个指针了。
代码
直接看代码,就明白了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <bits/stdc++.h> #define R 3 #define C 4 using namespace std;
void work1(int [][C]); void work2(int (*)[C]); void work3(int *);
int main() { int arr[R][C]; for (int i=0, x=1; i < R; i++) { for (int j=0; j < C; j++, x++) { arr[i][j] = x; } } cout << "二维数组:" << endl; for (int i=0; i < R; i++) { for (int j=0; j < C; j++) { cout << arr[i][j] << " "; } cout << endl; } cout << endl;
work1(arr); work2(arr); work3((int *)arr);
return 0; }
void work1(int a[][C]) { cout << "使用下标进行二维数组传参" << endl; cout << "a[1][3] = " << a[1][3] << endl; cout << "*(*(a + 1) + 3) = " << *(*(a + 1) + 3) << endl << endl; }
void work2(int (*p)[C]) { cout << "用行指针(二维)进行二维数组传参" << endl; cout << "p[1][3] = " << p[1][3] << endl; cout << "*(*(p + 1) + 3) = " << *(*(p + 1) + 3) << endl << endl; }
void work3(int *p) { cout << "使用指针(一维)进行二维数组传参" << endl;
cout << "p[7] = " << p[7] << endl;
cout << "*(p + 7) = " << *(p + 7) << endl << endl; }
|
输出:

结语
这一部分容易混淆,建议多学习多思考多实践(自己敲敲三种实现方式的代码)。