文章目录
前言
一、函数
函数:完成某一个功能的代码块
1.1 函数分类
函数分为库函数和自定义函数
-
库函数
库函数是c语言自带的函数,如果想要使用某个库函数,需要引入对应的头文件(.h文件)。 -
自定义函数
自定义函数是由开发者根据自己需求设计出的函数。
1.2 函数的语法结构
函数由四部分组成,分别是:
- 函数名
- 函数参数(可有可无)
- 函数语句
- 返回值类型
return_type fun_name(param1,...)
{
statement;
}
1.3 函数参数
1.3.1 实际参数(实参)
实际参数的组成:常量、变量、表达式、函数等。
在函数调用时,实际参数会传递给形式参数。
1.3.2 形式参数(形参)
形式参数是指在函数进行声明时函数名括号中的变量,形式参数在函数调用时才被分配内存,在函数被调用完成后自动销毁。
1.4 实际参数向形式参数传递两种情况
1.4.1 实际参数向形式参数传递变量的值
当实际参数为变量时,实际参数向形式参数传递变量的值时,由于实际参数和形式参数的变量分配的是不同的内存空间,修改形式参数的值不会改变实际参数的值。
下面这段代码将不会成功交换a和b的值:
void swap(int a, int b)
{
int z = a;
a = b;
b = z;
}
int main() {
int a = 10;
int b = 20;
printf("交换前: a = %d,b = %d\n", a, b);
swap(a,b); //向形式参数传递实际参数的值
printf("交换后: a = %d,b = %d\n", a, b);
return 0;
}
1.4.2 实际参数向形式参数传递变量的地址
当实际参数为变量时,实际参数向形式参数传递了变量的地址,形式参数为指针变量,通过修改指针变量指向的对象可以改变实际参数的值。
下面的代码成功交换a和b的值
void swap2(int* pa, int* pb)
{
int z = *pa; //*pa表示对pa指针变量指向的对象进行操作
*pa = *pb;
*pb = z;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前: a = %d,b = %d\n", a, b);
swap2(&a,&b); //向形式参数传递实际参数的地址
printf("交换后: a = %d,b = %d\n", a, b);
return 0;
}
1.5 函数调用
1.5.1 函数的嵌套调用
函数的嵌套调用是指各个函数之间可以相互的调用。
1.5.2 函数的链式调用
函数的链式调用是指一个函数的返回值作为另一函数的形式参数的值。例如
//函数的链式调用
//printf()函数的返回值为打印字符串的个数
int main()
{
int a = 20;
printf("%d", printf("%d", printf("%d", a)));
return 0;
}
1.6 函数的声明和定义
1.6.1 函数的声明
- 函数声明的作用是告诉编译器函数的名字,函数的参数类型,函数的返回值类型,函数具体是否存在,函数声明无法决定。
- 函数声明一般在函数使用之前,满足先声明后使用。
- 函数的声明一般放在头文件中。
例如:在add.h头文件中声明add()函数
//声明add函数
int add(int, int); //形式参数的名字可省略
1.6.2 函数的定义
函数的定义是指函数的具体实现。
例如:在add.c文件中完成函数的定义
//add函数的定义
int add(int x,int y)
{
return (x + y);
}
如果其他源文件想要使用add()函数,只需要引入声明函数的头文件
#include "add.h"
int main()
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
int ret = add(x, y);
printf("%d", ret);
}
二、函数的模块化编程
假设开发一计算器功能,根据模块化开发思想,可以将计算器按功能进行拆分,每个模块完成一个功能,如下图所示: