【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针
发布日期:2021-07-01 00:06:57 浏览次数:2 分类:技术文章

本文共 1053 字,大约阅读时间需要 3 分钟。

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

文章目录

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

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

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

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

  • 代码:35-1.c
#include 
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)); //4 printf("sizeof(*a) = %d\n",sizeof(*a)); //12 for(i=0; i
int(*a)[2][3] a指向int[2][3]的数组 for(i=0; i
  • 编译运行结果为:

在这里插入图片描述

3 总结

注意,C语言中只会以值拷贝的方式传递函数参数,所以如果想要修改某一个内存中的内容,就必须向函数传递该内容所在内存的地址。

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

转载地址:https://lyy-0217.blog.csdn.net/article/details/87997401 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数
下一篇:【C语言进阶深度学习记录】三十 二维数组与二维指针

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年05月04日 15时03分36秒