山东工程网站建设,肃宁哪里建网站,成都到西安需要隔离吗,上海注册建网站之前的学习数组的文章中#xff0c;已经知道一维数组作为函数参数的时候#xff0c;最终会被编译器编译为指针。今天来看看二维数组的情形 文章目录1 为什么C语言中的数组作为函数参数会退化为指针#xff1f;2 二维数组作为函数参数如何退化2.1 代码案例分析#xff08;传… 之前的学习数组的文章中已经知道一维数组作为函数参数的时候最终会被编译器编译为指针。今天来看看二维数组的情形 文章目录1 为什么C语言中的数组作为函数参数会退化为指针2 二维数组作为函数参数如何退化2.1 代码案例分析传递二维数组给函数参数3 总结 1 为什么C语言中的数组作为函数参数会退化为指针
C语言是一种高效的语言
当参数传递的时候如果将整个数组都拷贝过来的话拷贝数组的过程会非常的低效开销比较大如果数组过大参数位于栈上很容易导致栈溢出
2 二维数组作为函数参数如何退化
二维数组可以看做是一维数组该一维数组存的元素是另一个一维数组。
二维数组中第一维的参数可以省略。如下图所示 下图中是不同的数组类型作为函数参数的时候会被编译器编译成的样式 注意区分指针数组与二维数组退化后的不同形式。 同时我们需要非常注意以下几点 C语言中无法向一个函数传递任意的多维数组所以说不是所有的数组维度都能作为函数参数 必须提供除第一维之外的所有维长度 第一维之外的所有维度信息用于完成指针运算N维数组的本质是一维数组元素是N-1维的数组对于多维数组的函数参数第一维的元素个数必须以函数参数的形式传给函数否则在函数体内无法得到整个函数
2.1 代码案例分析传递二维数组给函数参数
代码35-1.c
#include stdio.hvoid access2d(int a[][3], int row){ int col sizeof(*a)/sizeof(int); //int a[][3] int(*a)[3],a是指针指向类型为int[3]的数组int i0,j0; //所以sizeof*a 的大小是3*412printf(sizeof(a) %d\n,sizeof(a)); //4printf(sizeof(*a) %d\n,sizeof(*a)); //12for(i0; irow; i){for(j0; jcol; j){printf(%d ,a[i][j]);}printf(\n);}printf(\n);
}void access3d(int a[][2][3], int n){int i0,j0,k0;printf(sizeof(a) %d\n,sizeof(a)); //4printf(sizeof(*a) %d\n,sizeof(*a));//24int a[][2][3]int(*a)[2][3] a指向int[2][3]的数组for(i0; in; i){for(j0; j2; j){for(k0; k3; k){printf(%d ,a[i][j][k]);}}printf(\n);}printf(\n);
}
int main(){int a[3][3] {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};int b[1][2][3] {0};access2d(a, 3);access3d(b, 1);return 0;
}编译运行结果为 3 总结
注意C语言中只会以值拷贝的方式传递函数参数所以如果想要修改某一个内存中的内容就必须向函数传递该内容所在内存的地址。
多维数组作为函数参数的时候必须传递除了第一维之外的所有维的大小信息。最终多维数组在函数中被编译器编译为指针。一定要牢记各个数组类型最终退化为什么样的指针。参考本中的图表