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