今天开始函数的学习
目录
1、函数的基本概念
1.1函数的意义
1.2函数的分类
2自定义函数
2.1自定义函数的整个过程
函数定义
函数声明
函数调用
实参
形参和实参的关系
2.2函数传参
地址传递
2.3static的使用
1、函数的基本概念
1.1函数的意义
概念:一个大的程序一般应分为若干个程序模块,每一个模块实现一个特定的功能,这些模块被称之为子程序,在c语言中子程序用函数实现。
作用:封装代码,减少重复
1.2函数的分类
主函数:一个项目或者一个工程都有且仅有一个主函数,程序的运行都是从main函数开始,终止于main函数。
子函数:
库函数:标准库函数(系统函数)
非标尊库函数、第三方函数
数库:
自定义子函数:自己写的函数;
2自定义函数
2.1自定义函数的整个过程
1-->函数的定义--函数实现功能的整个过程。
2-->函数的声明--告诉编译器,该函数存在。
3-->函数的调用--函数真正的运行。
函数定义
格式:
返回值类型 函数名(形参类型 形参名,,,,)//函数头
{
函数体;//实现真正的功能;
return 返回值;
}
返回值类型: 和 return 后面的具体的返回值保持一致即可;
无返回值: 返回值类型写 void;
注意: 返回值只能返回一个数!
函数名: 遵循标识符命名规则; -- 驼峰式 -- Dht11_Init , Fun
形参:
函数在定义的时候写在函数名后面的小括号种的参数, -- 形参
1--> 如果没有形参 -- ( void 或者不写)
2-->形参类型和形参名必须一一对应, (int a,int b)--局部变量
3-->形参列表也叫做定义变量, 在形参列表定义过的变量, 直接在函数体使用即可, 不
能再重复定义
函数声明
格式:函数头:
功能:告诉编译器,该函数存在
位置:放在调用它的函数的上面,一般统统放在main函数的上面。
函数调用
格式:
返回值类型 变量名=函数名(实参);
返回值类型和函数的返回值类型保持一致;
变量名:符合标识符命名规则
函数名:用于别调用的函数名;
实参
函数被调用的时候,括号里面的提供的叫实参
1-->如果没有形参,实参就不用提供,什么都不写
2-->实参可以是变量、表达式、常量、地址,数组等
3-->实参不能写数据类型
形参和实参的关系
1-->形参的起始值来自于实参!
2-->实参的个数和位置必须和参数一一对应,传参也按照对应位置传递。
3-->形参和实参各自占用不同的内存空间
4-->形参名和实参名可以一行,也可以不一样,各种是各自的局部变量。
函数调用的其他格式:
有参有返: 返回值类型 变量 = 函数名(实参);
有参无返: 函数名(实参);
无参有返: 返回值类型 变量 = 函数名();
无参无返: 函数名();
注意:
子函数执行: 只有被调用, 才能执行, 并且只有被调用计算机才分配空间;
子函数执行完, 空间会被释放
2.2函数传参
值传递:
形参的起始值来自于实参,形参的变化不会引起实参的改变。
举例说明:
原因:形参和实参各自占用不同的内存空间
地址传递
传递变量的地址,通过指针,改变指针指向的空间内容。
数组传参:属于地址传递,写数组名--数组名表示数组的首元素地址
2.3static的使用
全局变量和局部变量:
全局变量: 定义在函数体外部的变量
生命周期: 从定义处开始, 到当前.c 结束;
作用范围: 从定义处开始, 到当前.c 结束;
局部变量: 定义在函数体内部的变量
生命周期: 从定义处开始, 到当前函数结束;
作用范围: 从定义处开始, 到当前函数结束;
static 修饰局部变量: 延长生命周期! !
位置: 定义局部变量的时候!
被 static 修饰的局部变量:
生命周期: 和全局变量一样
作用范围: 从定义处开始, 到当前函数结束;