200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

时间:2023-04-14 09:18:33

相关推荐

【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针

之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针。今天来看看二维数组的情形

文章目录

1 为什么C语言中的数组作为函数参数会退化为指针?2 二维数组作为函数参数如何退化2.1 代码案例分析(传递二维数组给函数参数)3 总结

1 为什么C语言中的数组作为函数参数会退化为指针?

C语言是一种高效的语言:

当参数传递的时候如果将整个数组都拷贝过来的话,拷贝数组的过程会非常的低效,开销比较大如果数组过大,参数位于栈上,很容易导致栈溢出

2 二维数组作为函数参数如何退化

二维数组可以看做是一维数组,该一维数组存的元素是另一个一维数组。

二维数组中第一维的参数可以省略。如下图所示:

下图中是不同的数组类型作为函数参数的时候,会被编译器编译成的样式:

注意区分:指针数组与二维数组退化后的不同形式。

同时我们需要非常注意以下几点:

C语言中无法向一个函数传递任意的多维数组(所以说不是所有的数组维度都能作为函数参数)

必须提供除第一维之外的所有维长度

第一维之外的所有维度信息用于完成指针运算N维数组的本质是一维数组,元素是N-1维的数组对于多维数组的函数参数,第一维的元素个数必须以函数参数的形式传给函数,否则在函数体内无法得到整个函数

2.1 代码案例分析(传递二维数组给函数参数)

代码:35-1.c

#include <stdio.h>void access2d(int a[][3], int row){int col = sizeof(*a)/sizeof(int); //int a[][3] ==> int(*a)[3],a是指针,指向类型为int[3]的数组int i=0,j=0; //所以sizeof(*a) 的大小是3*4=12;printf("sizeof(a) = %d\n",sizeof(a)); //4printf("sizeof(*a) = %d\n",sizeof(*a)); //12for(i=0; i<row; i++){for(j=0; j<col; j++){printf("%d ",a[i][j]);}printf("\n");}printf("\n");}void access3d(int a[][2][3], int n){int i=0,j=0,k=0;printf("sizeof(a) = %d\n",sizeof(a)); //4printf("sizeof(*a) = %d\n",sizeof(*a));//24,int a[][2][3]==>int(*a)[2][3] a指向int[2][3]的数组for(i=0; i<n; i++){for(j=0; j<2; j++){for(k=0; k<3; 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语言中只会以值拷贝的方式传递函数参数,所以如果想要修改某一个内存中的内容,就必须向函数传递该内容所在内存的地址。

多维数组作为函数参数的时候,必须传递除了第一维之外的所有维的大小信息。最终多维数组在函数中被编译器编译为指针。一定要牢记各个数组类型最终退化为什么样的指针。参考本中的图表

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。