当前位置: 首页 > news >正文

从最浅层剖析C语言————第六节(深入了解数组传参、嵌套调用以及链式访问)

目录

 

1. 前情提要

2. return语句

3. 数组作为函数参数

4.嵌套调用和链式访问

4.1 函数的嵌套调用

4.2 链式访问


 

1. 前情提要

前面我们讲到了函数里面的形参和实参的概念,形参顾名思义就是一个形式上的参数,不参与实际的运算,而实参则刚好相反

但是实参是需要传递给形参的,他们两个之间是存在联系的

但是形参和实参又都是各自独立的内存空间,我们接下来就用监视窗口来观察一下形参和实参分别占据的地址

3bc9ab5314b347438c095807dde1c4c9.png

5bcba1b9d3e045df8237da0c0b3c53cd.png

从上面的监视窗口可以看到,在我们执行完了整个函数的情况下,a,b里面的值的确传给了x,y

但是,a,b的地址与x,y是不相同的

2. return语句

我们在第一次写C语言程序的时候,main函数的结尾就需要写上一个return 0;

那return的作用到底是什么呢?

·return后面可以是一个数值,也可以是一个表达式,如果是表达式的话就优先执行表达式

·return后面同样可以什么都没有,直接写一个return,这种写法就适用于那些函数返回类型为void的情况

·一旦return后面返回的类型与函数本身返回类型是不一样的,那么系统将会自动的将你的返回值转换为函数的返回类型

·return语句执行完毕之后,函数就会彻底返回,后面的代码不会继续执行

·如果函数里面存在if等分支语句的情况下,则需要保证每一种情况下都有return返回,否则将会出现编译错误

3. 数组作为函数参数

在我们后面需要在各种函数问题当中,经常会遇到需要将数组作为参数传递给函数的情况,从而实现在函数内部对于数组进行操作

但我们要如何进行数组传参呢?

我们在之前学习数组的内容的时候就知道,数组里面是可以储存很多个元素的(元素类型必须保证要相同)

那我们想要将数组传递过去,也就是等同于将数组里面的每一个元素都传递过去

能实现这个功能的第一步就是需要获取到数组里面的每一个元素,这个操作我们一般称为遍历数组

而访问数组里面的很多个元素,就需要用到for循环来首先生成数组里面的各个元素的下标,有了下标,我们再去利用下标访问操作符来进行访问就可以了

932cfe7dce0d42699ec38c6887165ecb.png

值得注意的是,比如要计算数组里面的元素个数的多少,我们可以用上面蓝笔标注出来的代码来进行实现

在这里强调几个数组传参的重要知识

·函数的形式参数要与函数里面的实际参数个数保持相同

·函数的实参是数组,形参也可以写成是数组的形式

·当函数的形参是一维数组的时候,数组的大小可以省略不写,如上面只写了arr[ ],

·当函数的形参是二维数组的时候,数组的行可以省略,但是列不能省略

·数组传参的时候,形参是不会创建新的数组

·所以形参所操作的数组与实参是同一个数组,这一点与传元素过去有所区别

4.嵌套调用和链式访问

4.1 函数的嵌套调用

嵌套调用实际上就是函数的互相调用,一个函数的内部调用会调用另一个函数,正因为函数之间有效的相互调用,最后才能写出来相对大型的程序

接下来我们便写出一个选择排序的代码

//简单的选择排序
#include<stdio.h>
void swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
void Selection_sort(int arr[], int sz)
{int i,min,j;for (i = 0; i < sz; i++){min = i;for (j = i + 1; j < sz; j++){if (arr[j] < arr[min]){min = j;}}swap(&arr[i], &arr[min]);}
}
void print_arr(int arr[], int sz)
{int i;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };int sz = sizeof(arr) / sizeof(arr[0]);Selection_sort(arr, sz);print_arr(arr, sz);return 0;

这个代码的Selection_sort里面就调用了另一个swap函数,每一个函数都具有一个独立的功能,之后很多很长的代码实际上都是函数之间的嵌套调用,但是函数是不能被嵌套定义的

4.2 链式访问

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

688577afaff6414f9b0bece26aa78d0d.png

就像上图的代码一样,将strlen的返回值作为printf函数的参数,这就是一个很简洁的关于函数的链式访问的示例

接下来我们再看一个非常有趣的代码,学会了可以拿这个代码去考你的舍友和老师哦~

6666a2f5c91d42fc881aab432462fe39.png

思考一下,这个代码最后的输出结果会是什么呢?

关键就在于要弄明白printf函数的返回值是什么

其实学到现在,大部分同学可能都没想到printf这个经常使用的函数竟然还会有返回值呢?!

遇函数不知,cplusplus.com网站会给出答案

在大家的学习过程中,遇到有函数不认识或者不了解的,都可以去上面这个网站完整的了解这个函数,只有真正完全了解一个函数,我们之后才能更加熟练的去使用这个函数,也能在之后根据这个函数的底层逻辑去写出更好的函数

8277241e4a6d48079e4d1c75e74b05d1.png

printf的返回值就是打印在屏幕上字符的个数注意:是打印出字符的个数

那么上面那个代码,第三个printf打印43,所以返回值是2,第二个printf打印2,所以返回值是1,第一个printf最后就打印了一个1

所以最后屏幕上会打印出4321,正如下图所示

941522d1e5af47fab62146dc25d149df.png

 


http://www.mrgr.cn/news/78873.html

相关文章:

  • AI 声音:数字音频、语音识别、TTS 简介与使用示例
  • C#Treeview
  • 大数据机器学习算法与计算机视觉应用06:梯度下降
  • 【Unity-如何提高物理引擎的高精度模拟】
  • sunshine+moonlight
  • ENSP IPV6-over-IPV4
  • 2024.12.2工作复盘
  • yolov10 获取误检,漏检
  • shell编程(4)脚本与用户交互以及if条件判断
  • 初识一维和二维数组
  • 编译器优化技术
  • AI-学习路线图-PyTorch
  • NuHertz/HFSS: 使用矩形、径向和阻抗短截线的平面 LPF 切比雪夫-II 实现
  • 公专业务能力
  • 【C语言】结构体(二)
  • Hot100 - 二叉树的中序遍历
  • 利用市场分析工具对特定国家的产品市场情况进行深入分析的全面指南
  • 无需U盘引导!快速在实体机上安装黑群晖 DSM 7.2(一步到位!黑群晖 DSM 7.2 内置硬盘引导安装教程)
  • Kafka-Connect自带示例
  • Maven学习
  • 力扣题解14——最长公共前缀
  • ThinkPHP Nginx 重写配置
  • 【老白学 Java】抽象类和抽象方法
  • 【UE5 C++】判断两点连线是否穿过球体
  • 基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现
  • 【NLP 4、数学基础】