4. 函数的调用
4.1 传值调用
函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参
4.2 传址调用
1.传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
2.这种传参方式可以把函数与函数外部的变量真正的联系起来,从而在函数内部直接操作函数外部的变量
4.3 实例
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
void Swap2(int* px, int* py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 10;
int b = 20;
//传值调用
Swap1(a, b);
//传址调用
Swap2(&a, &b);
printf("%d %d ", a, b);
return 0;
}
在上述代码块中,用了不同传参方式的函数去实现两个数值的交换
- Swap1函数的传参方式为传值调用,它的结果如下所示
- 可以看出,a,b 的内容并没有实现交换
- 因为传值调用的特点是 函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参
- Swap2函数的传参方式为传址调用,它的结果如下所示
- a,d的值实现了交换
- 因为在Swap2中,传的参数分别为a,b的地址,在Swap2函数的内部,通过解引用后就可以找到Swap2函数外部的 a,b ,从而进行交换
5.函数的嵌套调用和链式访问
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
5.1 嵌套调用
//被调用函数
void line()
{
printf("如果被调用一次,打印一次这句话\n");
}
//嵌套调用函数
void Call()
{
//三次for循环调用line函数三次
int i = 0;
for (i = 0; i < 3; i++)
{
line();
}
}
//主函数
int main()
{
Call();
return 0;
}
结果如下
函数与函数之间可以嵌套调用,但是不能嵌套定义,函数之间是平行关系,不是包含关系
5.2 链式访问
一个函数的返回值做了另一个函数的参数,这个返回值如同链条串起了两个函数
#include<string.h>
int main()
{
//常规求字符串长度
int len = strlen("abcdef");
printf("%d\n", len);
//链式访问
printf("%d\n", strlen("abcdef"));
return 0;
}
上述代码中,在利用strlen函数求字符串长度
- 常规方法是,先定义一个整型变量用来接收strlen函数的返回值,然后printf函数打印
- 链式访问是,在printf函数中直接调用strlen函数,并且把string函数的返回值当作printf函数的参数
6 函数的声明和定义
6.1 函数声明
- 确定一个函数的名称、参数以及返回类型
- 函数的声明要在函数使用之前,满足先声明后使用
- 函数的声明一般要包含在头文件中
6.2 函数定义
函数定义是描述函数具体是怎么实现
函数声明
函数的声明在头文件中
函数的定义
函数在头文件中声明之后,然后实现它的功能,也就是函数定义
总结
函数第二部分的内容就是这些。