二维数组作函数参数的三种方式

前言

二维数组作函数参数的本质都是传递数组的首地址,但是具体的写法有3种,例子如下:

  1. void work1(int [][C])
  2. void work2(int (*)[C])
  3. 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[1][3] = " << p[1][3] << endl; // 不能这么写了
cout << "p[7] = " << p[7] << endl;
// cout << "*(*(p + 1) + 3) = " << *(*(p + 1) + 3) << endl; // 不能这么写了
cout << "*(p + 7) = " << *(p + 7) << endl << endl;
}

输出:

输出

结语

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