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

从最浅层剖析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.kler.cn/a/419709.html

相关文章:

  • 2024前端框架年度总结报告(二):新生qwik+solid和次新生svelte+Astro对比 -各自盯着前端的哪些个痛点 - 前端的区域发展差异
  • react 使用状态管理调用列表接口渲染列表(包含条件查询,统一使用查询按钮,重置功能),避免重复多次调用接口的方法
  • Hive分区裁剪(Partition Pruning)详解
  • JavaScript(JS)的对象
  • JAVA设计模式,动态代理模式
  • 5G CPE介绍(一)
  • UI设计从入门到进阶,全能实战课
  • 源码分析之Openlayers的核心EventTarget类的实现
  • Python 列表操作详解
  • 深入解析数据结构:红黑树、哈希Map、B树与B+树的底层逻辑
  • ctfhub web技能树篇
  • 基于 PostgreSQL 和 PostGIS 数据服务器模式的设计方案
  • 高斯消元——acwing
  • C++stack、queue
  • npm安装依赖后报错
  • 【计算机网络】实验6:IPV4地址的构造超网及IP数据报
  • Go运行Grule引擎实现计费规则管理
  • 【Linux】开启你的Linux之旅:初学者指令指南
  • LeetCode27.移除元素
  • NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比
  • 深入浅出机器学习中的梯度下降算法
  • 【深度学习】检索增强生成 RAG
  • JAVA中的@Builder是什么意思
  • Day29 贪心算法 part03
  • # 02_Python基础到实战一飞冲天(三)-python面向对象(二)--初始化方法和内置方法
  • MyBatis-Plus介绍及基本使用