二维数组作函数参数的三种方式
前言
二维数组作函数参数的本质都是传递数组的首地址,但是具体的写法有3种,例子如下:
- void work1(int [][C])
- void work2(int (*)[C])
- void work3(int *)
讲解
第一种和第二种都可以自动计算索引,也就是可以使用下标[]去访问数组,而第三种不可以。
第一种
最基本的方法,无需多说,要注意的就是形参名第一维的长度不需指定,但第二维的长度必须指定。
第二种
该方法是通过传递二维数组的行指针实现的,定义行指针的方式如下:
int (*p)[3]
要是不懂的话(懂得二维数组的行指针和列指针)自己去工具书里重修一下或者去其他地方搜。
第三种
这就是直接当一维数组传一个指针了。
代码
直接看代码,就明白了!
| 12
 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;
 }
 
 | 
输出:

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