【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针
发布日期:2021-07-01 00:06:57
浏览次数:2
分类:技术文章
本文共 1053 字,大约阅读时间需要 3 分钟。
之前的学习数组的文章中,已经知道一维数组作为函数参数的时候,最终会被编译器编译为指针。今天来看看二维数组的情形
文章目录
1 为什么C语言中的数组作为函数参数会退化为指针?
C语言是一种高效的语言:
- 当参数传递的时候如果将整个数组都拷贝过来的话,拷贝数组的过程会非常的低效,开销比较大
- 如果数组过大,参数位于栈上,很容易导致栈溢出
2 二维数组作为函数参数如何退化
二维数组可以看做是一维数组,该一维数组存的元素是另一个一维数组。
二维数组中第一维的参数可以省略。如下图所示:
- 下图中是不同的数组类型作为函数参数的时候,会被编译器编译成的样式:
注意区分:指针数组与二维数组退化后的不同形式。
同时我们需要非常注意以下几点:
-
C语言中无法向一个函数传递任意的多维数组(所以说不是所有的数组维度都能作为函数参数)
-
必须提供除第一维之外的所有维长度
- 第一维之外的所有维度信息用于完成指针运算
- N维数组的本质是一维数组,元素是N-1维的数组
- 对于多维数组的函数参数,第一维的元素个数必须以函数参数的形式传给函数,否则在函数体内无法得到整个函数
2.1 代码案例分析(传递二维数组给函数参数)
- 代码:35-1.c
#includevoid 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年05月04日 15时03分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
只有1%的程序员搞懂过浮点数陷阱
2019-05-01
一名 Google 工程师的大数据处理经验
2019-05-01
命名难,难于上青天
2019-05-01
没钱没公司,怎么做一款付费产品
2019-05-01
代码整洁之道-编写 Pythonic 代码
2019-05-01
树莓派程序开机自启动
2019-05-01
连锁门店无线通信方案
2019-05-01
配置Lotus Domino集群视频详解
2019-05-01
Linux软件万花筒
2019-05-01
全球开源软件发展趋势分析
2019-05-01
Linux常用的安全工具
2019-05-01
python 多进程之进程池的操作
2019-05-01
flask整理之 flask程序中的debug模式
2019-05-01
比特币,父母这一辈能接受吗?
2019-05-01
为什么要反对比特币,这不代表是空气币
2019-05-01
SnapEx的新感觉,对新手很友好
2019-05-01
首个聚合器怎么产生的,并运用领域在什么
2019-05-01
区块链技术应用,最先医疗行业
2019-05-01
新币上市旧币会降价吗
2019-05-01