从最浅层剖析C语言————第六节(深入了解数组传参、嵌套调用以及链式访问)
目录
1. 前情提要
2. return语句
3. 数组作为函数参数
4.嵌套调用和链式访问
4.1 函数的嵌套调用
4.2 链式访问
1. 前情提要
前面我们讲到了函数里面的形参和实参的概念,形参顾名思义就是一个形式上的参数,不参与实际的运算,而实参则刚好相反
但是实参是需要传递给形参的,他们两个之间是存在联系的
但是形参和实参又都是各自独立的内存空间,我们接下来就用监视窗口来观察一下形参和实参分别占据的地址
从上面的监视窗口可以看到,在我们执行完了整个函数的情况下,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循环来首先生成数组里面的各个元素的下标,有了下标,我们再去利用下标访问操作符来进行访问就可以了
值得注意的是,比如要计算数组里面的元素个数的多少,我们可以用上面蓝笔标注出来的代码来进行实现
在这里强调几个数组传参的重要知识
·函数的形式参数要与函数里面的实际参数个数保持相同
·函数的实参是数组,形参也可以写成是数组的形式
·当函数的形参是一维数组的时候,数组的大小可以省略不写,如上面只写了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 链式访问
链式访问,实际上就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问
就像上图的代码一样,将strlen的返回值作为printf函数的参数,这就是一个很简洁的关于函数的链式访问的示例
接下来我们再看一个非常有趣的代码,学会了可以拿这个代码去考你的舍友和老师哦~
思考一下,这个代码最后的输出结果会是什么呢?
关键就在于要弄明白printf函数的返回值是什么
其实学到现在,大部分同学可能都没想到printf这个经常使用的函数竟然还会有返回值呢?!
遇函数不知,cplusplus.com网站会给出答案
在大家的学习过程中,遇到有函数不认识或者不了解的,都可以去上面这个网站完整的了解这个函数,只有真正完全了解一个函数,我们之后才能更加熟练的去使用这个函数,也能在之后根据这个函数的底层逻辑去写出更好的函数
printf的返回值就是打印在屏幕上字符的个数,注意:是打印出字符的个数
那么上面那个代码,第三个printf打印43,所以返回值是2,第二个printf打印2,所以返回值是1,第一个printf最后就打印了一个1
所以最后屏幕上会打印出4321,正如下图所示