回顾知识
在之前的函数篇章里面我们与大家分享了两个使用函数解决的案例,一个是通过函数来获取两个整形变量的最大值
#include<stdio.h>
int get_max(int x, int y)
{
return (x > y ? x : y);
}
int main()
{
int a = 10;
int b = 20;
int max = get_max(a, b);
printf("%d", max);
return 0;
}
另一个是通过一个函数来实现交换两个整形变量的值
void exchange_num(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前: a = %d,b = %d\n", a, b);
exchange_num(&a,&b);
printf("交换后:a = %d,b = %d", a, b);
}
通过这两个代码我们了解到了什么是传值调用什么是传址调用,当我们需要使函数内外有一定的联系时我们需要使用传址调用。
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参
传址调用
传址调用是把函数外部创建变量的内存地址传给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外部的变量建立起联系,也就是函数内部可以直接操作函数外部的变量
由上面的知识我们总结出一句话:当函数调用的时候,实参传给形参时,形参将是实参的一份临时拷贝,所以对形参的修改是不影响实参的。这就是之前我们与大家分享的知识,在这里简单的复习一下,我们理解上面黄色背景的字可能有些困难,什么是形参?什么是实参?该如何定义呢?听我一一道来。
形参与实参
实参就是实际参数
真实传给函数的参数叫做实参
实参可以是:常量、变量、表达式、函数等,但无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,以便把这些值传递给形参
形参就是形式参数
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。
形式参数调用完之后就自己销毁了,所以形式参数只在函数中有效。
举个例子
void exchange_num(int* pa, int* pb)
{
int tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前: a = %d,b = %d\n", a, b);
exchange_num(&a,&b);
printf("交换后:a = %d,b = %d", a, b);
}
还是这个代码,实际参数&a,&b
,形式参数是pa,pb
。
函数的嵌套调用和链式访问
嵌套调用
顾名思义函数的嵌套调用就是,函数与函数之间可以任意组合,可以根据自己的需求相互调用。我们举一个例子
#include<stdio.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n", len);
}
如图我们想打印字符串"abcdef"
的长度,我们使用strlen()
库函数来求字符串长度之后用len变量接收,最后使用printf()
库函数来打印,这样写是不是太麻烦了,我们可以使用函数的嵌套调用,直接将strlen()
库函数求的值打印。
#include<stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));
}
如图两次的打印结果相同,这就是我们说的函数的嵌套调用,注意函数可以嵌套调用,但是不能嵌套定义。
链式访问
链式访问就是把一个函数的返回值作为另一个函数的参数,我们还是通过例子来让大家理解什么是链式访问
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
我们分析一下这个代码输出的是什么,我们发现,我们将后面printf()
库函数的返回值做为了前一个printf()
库函数的参数,那么我们需要知道他的返回值是什么,上一次我们分享了如何学习库函数,现在我们就可以学以致用
我们在网站 www.cplusplus.com 查询printf()
这个库函数,看到他的返回值类型的描述,他返回的是打印在屏幕上字符的个数。所以我们第一次输出43,第二次输出打印在屏幕上字符的个数2,第三次输出1,所以最后的结果为
不知道经过我们的讲解大家对嵌套调用和链式访问的认识是否加深了。