数组做函数参数,嵌套调用与链式访问

article/2025/6/29 15:50:26

文章目录

  • 前言
  • 一、数组做函数参数
  • 二、嵌套调用和链式访问
    • 2.1 嵌套调用
    • 2.2 链式访问

前言

这一块内容是衔接上一节函数内容,从更层次分析函数之中的细节


一、数组做函数参数

在平时用函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进行操作。
比如我们以一个题为例:
题目:写一个函数将一个整型数组的内容,全部置为-1,再写一个函数打印数组的内容

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数print_arr(arr, sz);

这里先存一个数组,然后为了实现前后的对比效果,我们先用print_arr把原数组打印出来,涉及到数组元素的打印,就要使用下标和循环了

void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}

这是printf_arr子程序内部代码
接下来就要进行置-1操作,我们依旧整理到一个函数内完成

void set_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){arr[i] = -1;}
}

完整代码展示如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void set_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){arr[i] = -1;}
}void print_arr(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数print_arr(arr, sz);//写一个函数将arr数组的内容全部设置为-1set_arr(arr, sz); //函数的调用//写一个函数,打印arr数组的所有内容print_arr(arr, sz);// -1 -1 -1 ....return 0;
}

运行效果:
在这里插入图片描述

这里的set_arr函数要能够对数组内容进行设置,就得把数组作为参数传递给函数处理,同时函数内部设置数组每个元素的时候,也得遍历数组,需要知道数组的元素个数,主函数中用sz存储了sizeof计算的数组元素个数,我们也给set_arr传递了两个参数,一个是数组,另一个就是数组的元素个数sz,对比观察就可以发现print_arr也是一样的,只有拿到了数组和元素个数,才能遍历打印数组的每个元素。

一句话来说,传数组,拿数组接收,传元素个数,拿元素个数接收

这里如果打开监视窗格观察了运行的过程你就会发现,数组在没有传参之前你能观察到所有的数组元素,但一旦传参进去就只能观察到第一个元素了,这里我们为了方便观察,把形参中的arr改为brr
在这里插入图片描述
如果你想要在函数里观察到数组的是个元素,就需要在监视窗格写brr,10了
在这里插入图片描述

重点提醒

  • 函数的形式参数要和函数的实参个数匹配
  • 函数的实参是数组,形参也可以写成数组形式的,这里形参也可以写成指针,暂时不讲
  • 形参如果是一维数组,数组大小可以忽略不写,即arr[ ]
  • 形参如果是二维数组,行可以省略,但是列不能省略

这里依旧以一个题目举例说明
//写一个函数打印二维数组

int arr[3][5] = { {1,2,3}, {2,3,4,5},{3,4,5,6,7} };

二维数组传参的时候传的就不是元素个数了,而是行和列

int main()
{int arr[3][5] = { {1,2,3}, {2,3,4,5},{3,4,5,6,7} };//写一个函数打印这个arr数组print_arr2(arr, 3, 5);return 0;
}

这是一个3行5列的数组,所以传参的时候,3代表行,5代表列
在这里插入图片描述
形参中r接收行,c接收列,3个实参对应3个形参,而且这是一行一行打印的,一行5个元素打印完在打印下一行,这里一行打印完再加个换行

  • 数组传参,形参是不会创建新的数组的
  • 形参操作的数组和实参的数组是同一个数组

最后两点是什么意思呢?数组传参和普通的变量传参是不一样的,变量传参时,实参和形参不是同一个东西,变量传参那里的形参是有自己的空间的,他们的地址是不一样的,而数组的传参本质上是在一个数组上操作的,并不是一种拷贝关系,更像是你在家打瓦和在网吧打瓦本质上是区别不是特别大的,都是在打瓦。

这里附以图片展示
在这里插入图片描述

可以看到这两个地址都是一样的


二、嵌套调用和链式访问

2.1 嵌套调用

嵌套调用就是函数之间的互相调用,每个函数就像一个乐高零件,正是因为多个乐高的零件互相无缝的配合才能搭建出精美的乐高玩具,也正是因为函数之间有效的互相调用,才能写出大型程序

以一个题目为例,假设要我们计算某年某月有多少天?如果要函数实现,可以设计两个函数:

  • is_leap_year():根据年份确定是否是闰年
  • get_days_of_month():调用is_leap_year确定是否是闰年后,再根据月计算这个月的天数。
    在这里插入图片描述
    在一年之中,只有二月有特殊情况,平年28天,闰年29天。其他月份都是固定的,因此,我们写程序的时候只要把2月特殊处理了就可以了,我们可以把这些天数放到一个数组里
int get_days_of_month(int y, int m)
{int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//             0   1   2   3  4   5   6    7   8int d = days[m];//需要一个闰年判断的功能if (is_leap_year(y) && (m == 2)){d += 1;}return d;
}

我们可以把这些天数放到一个数组里,但是下标是从0开始的,我们可以把他往后挪一挪,让31在下标1的位置上,也就是1月31天,我们只要在1月前面加个0,这样下标就和月份对应起来了。
这里当判断是闰年并且是2月的时候,28就会加1,不是闰年也不是2月份的时候,d直接返回就可以了,主函数用来接收get_days_of_month,还有一个子程序is_leap_year判断是不是闰年

完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdbool.h>
bool is_leap_year(int y)
{if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))return true;elsereturn false;
}int get_days_of_month(int y, int m)
{int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//             0   1   2   3  4   5   6    7   8int d = days[m];//需要一个闰年判断的功能if (is_leap_year(y) && (m == 2)){d += 1;}return d;
}int main()
{int year = 0;int month = 0;scanf("%d %d", &year, &month);//2008 8int day = get_days_of_month(year, month); //函数的调用printf("%d\n", day);return 0;
}

这里就是三联调用,main函数中调用get_days_of_month,get_days_of_month调用is_leap_year,这就是嵌套调用。

这些函数设计的足够单一,调用和复用起来也会更加容易。

2.2 链式访问

所谓链式访问就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问

题目举例

计算一个字符串的长度
在这里插入图片描述
注意,这里编译器发出了警告
strlen和sizeof的返回值类型都是size_t类型,size_t是无符号整型,这里最好类型匹配,所以这里printf也要改,用%zd或%zu

有的资料说
size_t类型的值使用%zd和%zu是一样的
但是有的资料说
size_t类型的使用%zu来打印,我也建议使用%zu
这样就与整型的无符号%u对应了,好记忆

但是这个在不同的编译器上的处理是不一样的,像VS里面就不用纠结,它直接提醒用%zd打印

接下来回到重点,有些跑题了哈哈
这里的中间商len赚差价了,有些繁琐,可以把len去掉,直接把返回值放到printf里
在这里插入图片描述
这里把printf后面的返回值作为前面%zd的参数而存在的,就像一个链条把内容串起来

这里还有一个有趣的例子

在这里插入图片描述

printf函数返回的是打印在屏幕上的字符的个数(上一章的网站中有英文解释),上面的例子中,我们就第一个printf打印的是第二个printf的返回值,第二个printf打印的是第三个printf的返回值

这里从右向左开始分析,打印43两个字符,虽然打印整数,但是4和3是以字符的形式,独立打印到屏幕上,所以第一个printf的返回值是2,第二个printf打印2,返回1,第一个printf打印1

所以屏幕上最终打印:4321

这里有兄弟说了,加空格不是更好看吗,实则不然,因为空格也是字符,这样就是43 3 2 了
在这里插入图片描述

链式访问一定是在调用函数的时候,把函数的参数作为它的返回值,该printf函数也是在调用它而不是实现它,而嵌套调用的意思是实现一个函数的时候调用了其他函数

今天的技术分享就到这里,喜欢作者内容的兄弟不要忘记一键三连给予支持哦,今天真是误算了,以为这一块能写的很快,结果写到现在0点34.。。。。


http://www.hkcw.cn/article/GgJmmRduaP.shtml

相关文章

央行降息 普通人该做什么 调整投资组合应对变化

2025年5月7日,央行宣布实施“双降”政策,“降准0.5%+ 降息0.1%”,释放长期流动性约1.2万亿元。这是继2024年9月后又一次超预期的货币政策调整。此次政策的核心目标是降低实体经济融资成本,刺激居民消费,稳定楼市,实现经济“软着陆”。“双降”政策对投资者会产生影响。主…

北京多区居民被巨响惊醒 系火流星 夜空奇观点亮京城

2025年5月31日凌晨2时51分,一颗火流星划过北京夜空。凌晨3时左右,北京通州、顺义、怀柔等多区居民在睡梦中被一声巨响惊醒,少数居民目击了漆黑夜空被“点亮”的奇观。中国科学院大学流星多站视频监测网的兴隆流星观测站成功捕捉到这次天文现象,记录下明亮的火流星照亮北京夜…

油价要涨!5月31日92号汽油价格 预计下周上调

今日最新油价调整资讯显示,5月31日的油价预计将在6月3日晚进行调整,上调幅度约为80元/吨(0.05元/升-0.07元/升)。这意味着刚刚在5月大幅下跌的油价将重新上涨。截至5月31日0时,国际原油市场的最新情况是纽约商品交易所(WTI)原油价格下跌0.44%,每桶报价60.67美元;布伦特原…

美的集团董事长方洪波再谈小米 战略上不惧竞争

5月30日下午,美的集团在佛山总部召开2024年度股东大会。今年小米在空调市场掀起低价竞争,其大家电业务一季度收入同比翻倍增长。此前,方洪波在访谈中提到“在战术上重视小米、在战略上不惧怕小米”。有投资者在美的股东大会上追问这句话的含义。方洪波解释说,家电业是高度竞…

龙舟赛上划最快的原来是救援队 去年也是他们最快

端午佳节,山东济南大明湖景区举行了一场盛大的龙舟赛,吸引了众多游客前来观赛。上午9时39分许,两只龙舟敲鼓出发进行比拼。然而比赛刚开始不久,围观人群中就传来呼声,一艘龙舟翻船了。现场目击者称,刚一开始,比赛就结束了。翻船的是落后的那只龙舟,但船员们都穿着救生衣…

古画里的端午氛围感拉满 解锁千年仪式感

端午节作为中国四大传统节日之一,在2000余年的历史长河中积累了丰富的仪式感。端午节前夕,山东博物馆通过古画和年画展示了多样的节俗。在文物鉴赏室,山东博物馆书画部研究馆员鲍艳囡展示了清朝大臣蒋溥所绘的《天中五瑞图》。这幅1米多长的画轴上,蜀葵、菖蒲、石榴花、枇杷…

“车圈恒大论”之下汽车行业谁最焦虑 负债真相解析

长城汽车董事长魏建军近期关于“汽车行业‘恒大’已经出现,只不过没爆”的言论引起了广泛关注。这一观点不仅揭示了新能源转型过程中部分企业的焦虑,也引发了对车企资产负债结构和盈利能力的深入讨论。将汽车行业简单类比为房地产行业的高杠杆模式并不准确。作为技术密集型制…

媒体人:杨瀚森第2站试训情况非常好 获积极反馈

北京时间5月31日,杨瀚森完成了NBA单独试训的第二站。据媒体人周鹏透露,杨瀚森的试训反馈非常不错,得到的消息是“非常不错!Good job!”这让人们感到踏实。在完成前两支球队的单独试训后,杨瀚森将先返回洛杉矶稍作休整,之后继续从洛杉矶出发,前往后续几支球队进行试训。…

四川通报59名医疗机构人员违规收费 廉洁整治行动展开

近期,相关部门收到关于某药企涉嫌向医生输送商业贿赂的举报信。对此,调查组迅速成立并展开调查核实工作。以下是调查处置进展情况。举报信涉及125名医疗机构人员,其中6人信息重复,1人信息不实,最终核实为118人,分布在36家医疗机构。经逐人核实,59人因参加病例收集、科普…

吉林通报李德明花千万建10个厕所 豪华公厕引争议

刚摘掉深度贫困县帽子的通榆县,时任县委书记李德明便斥资上千万元建设了10个豪华水冲公厕。日前,吉林省纪委监委公开通报了4起形式主义、官僚主义典型问题,其中就包括李德明搞劳民伤财的“形象工程”。2023年,李德明升任省农业农村厅厅长,直至2025年1月主动投案。在他主政…

乐高中国已终止与涉事博主合作 回应不友好言论争议

五月天主唱阿信与乐高品牌合作,但有网友发现,曾推广过乐高产品的博主周紫复曾发表对阿信的不友好言论,引发热议。5月30日深夜,乐高中国发布回应称,已启动调查程序,并决定立即终止与第三方合作公司的合作关系,对于涉及机构和博主永不合作。据第三方数据显示,截至5月31日…

【嵌入式Linux】zlog日志库

zlog日志库 1 简介1.1 核心特点1.2 核心概念 2 zlog日志库部署到项目工程2.1 下载zlog源码2.2 交叉编译zlog源码2.3 拷贝生成的静态库文件 3.zlog日志使用 1 简介 zlog是轻量级&#xff0c;高性能的C语言日志库&#xff0c;专为Linux/Unix系统设计&#xff08;也支持Windows系统…

韩大选进入白热化阶段 谁的胜算更大 悬疑反转不断

这场韩国大选的悬疑色彩比连续剧还狗血,现在谁稳赢还真不好说。大选还有一周就揭晓谜底,表面上看似波澜不惊,实际上暗流涌动。媒体们嘴上喊着李在明胜券在握,但实际数字显示,李在明和金文洙的支持率差距已缩小到12个百分点,一顿饭的工夫可能就没了。围观群众不能掉以轻心…

马克龙到访新加坡品尝小吃 总统夜市接地气体验

马克龙携夫人结束了对印尼的访问后,前往新加坡,这是他们在东南亚访问的最后一站。在前两站的访问中,马克龙和夫人引起了网友们的广泛关注和讨论。特别是在越南时,法国夫人疑似打了马克龙一巴掌,但在抵达印度尼西亚时,两人已经和好如初,还挽着胳膊下飞机,画面十分浪漫。…

坠海漂流7小时获救男子发声 争分夺秒的救援奇迹

近日,珠海万山海域上演了一场争分夺秒的海上救援行动。5月25日,万山区海上搜救分中心接到紧急通报,称有人员穿着救生衣在海面上漂浮。万山区迅速组织救援力量前往事发海域展开搜救。经过一个多小时的努力,救援人员成功将落水男子救起。据了解,当天中午该男子划乘的皮划艇被…

马克龙对华发出不切实际威胁想干嘛 法国版特朗普?

马克龙近期公开威胁中国,声称如果中国继续购买俄罗斯石油,将对中国买家实施制裁,甚至提出征收500%的关税。这一举动引发了外界的广泛讨论,有人质疑马克龙是否想让法国变成第二个特朗普。实际上,中国买不买俄罗斯石油,并不是马克龙一句话能决定的。这样的表态只会让法国在…

“苏超”把江苏踢“散”了吗 草根足球的硬核浪漫

当苏州码农用一脚世界波绝杀无锡程序员,当徐州外卖小哥与宿迁快递员在绿茵场上展开“楚汉争霸”,这个夏天,江苏人用脚下的足球点燃了一场全网瞩目的狂欢盛宴。“苏超联赛”不仅是一场草根足球的较量,更是一次城市文化与网络热梗的深度融合,重新定义了年轻人眼中的足球文化…

207. 课程表

我们需要判断是否能完成所有指定课程的学习&#xff0c;其中numCourses表示课程总数&#xff0c;prerequisites表示先修关系&#xff08;例如[0,1]表示学习课程0前需先完成课程1&#xff09;。 能完成课程学习的情况&#xff1a; 当课程的先修关系可以形成有效的拓扑排序时&…

vue3 ElMessage提示语换行渲染

在 ElMessage.error 中使用换行符 \n 并不会实现换行&#xff0c;因为 ElMessage 默认会将字符串中的换行符忽略。要实现换行显示&#xff0c;可以使用 HTML 标签 <br> 并结合 ElMessage 的 dangerouslyUseHTMLString 选项。以下是实现换行提示的代码示例&#xff1a; i…

使用lombok使用自动生成构造方法进行依赖注入

RequiredArgsConstructor 通过下面的方式 首先声明类注解 RequiredArgsConstructor在使用service时通过final进行注入即可 RequiredArgsConstructor 让你在不写构造函数的情况下&#xff0c; 通过 final 字段声明依赖关系&#xff0c;并由 Lombok 自动生成构造函数&#xff…