有任何不懂的问题可以评论区留言,能力范围内都会一一回答
本章节来自博主自身学习感受,评论区欢迎留言指出错误和讨论
继上期一维数组传参本质后(一维数组传参本质-优快云博客),我们要思考一下那么二维数组传参本质上传的是什么呢?
(看了数组与指针思考(1)-优快云博客数组与指针思考(2)-优快云博客会更好理解本章类容)
#define _CRT_SECURE_NO_WARNING
#include <stdio.h>
void exam(int arr[][2]) {
int sz2 = sizeof(arr) / sizeof(arr[0][0]);
printf("sz2=%d\n", sz2);
}
int main(void) {
int arr[3][2] = {1,2,3,4,5,6};
int sz1 = sizeof(arr) / sizeof(arr[0]);
printf("sz1=%d\n", sz1);
exam(arr);
return 0;
}
如上图,arr[3][2]是二维数组,void exam(int arr[][2])中的arr[][2]可以替换成什么呢?
博主我尝试了许多最后做成了下面这个excel表格
5,6,7 编译失败的原因是二维数组的第二个[]中的值必须明确
从excel表格我们可以得出以下结论
由2,3,4知int*[ ]中的[ ]中的值无论取什么都可行
由5,9,10知int[ ][ ]中第二个[ ]的值无论取什么都可以
由11,12知int[ ][ ]中第一个[ ]的值无论取什么都可以,但是第二个[ ]不能为空
但是我们根据上面的结论还是无法得知二维数组到底本质上传的是什么?
但是我么会发现这个地方sz2打印结果和上一章一维数组一样还是2
同时结合上一章一维度数组传参,我们可以知道这一章本质上传的还是地址
但是具体是什么地址呢?
我们不妨来调试一下
由上图划线地方我们知道,二维数组传参本质上传的是一个数组指针,上图的就是一个数组指针,即一个指向有两个元素的一维数组的指针,
这也就算为什么上面为什么int[][]中第二个[]不能为空的原因之一
(其他原因可以看数组与指针思考(2)-优快云博客)
如果第二个[ ]不写你就无法知道你指向的那个数组的大小。
第一个[ ]可以当做指针去理解
而其他的[ ]则确定了该指针指向的数组大小
这样我们再去调试试试,看看三维数组传参的本质是什么
由图知,三维数组的传参本质上还是传的数组指针,因此多维数组传的也是数组指针,
但也因我们传的地址指向的空间大小必须明确,所以多维数组的第一个[]可以不明确,但是其他的[]必须明确
第一个[]代表指针可以不明确,而其他的[]代表指针指向数组的大小必须明确,这样才能确保多维数组在函数传参时不会出错