函数特点:
1> 一小段代码。
2>完成某项特定的任务。
3>可以复用,提升开发效率。
补:
1.X86 表示32位环境 —— 编译生成的32位的程序
2.X64 表示64位环境 —— 编译生成的64位的程序
一,库函数(可以直接使用的函数)
1. 库函数的使用方法
eg:sqrt
double sqrt (double x);
sqrt 为函数名
x 是函数的参数,表示调用sqrt函数需要传递一个double类型的值
double 是返回类型 - 表示函数计算的结果是double类型的值
输出结果:
二, 自定义函数(根据需要自己设定创造的函数)
2.1函数的语法形式
ret_type fun_name(形式参数)
{
}
ret_type 为函数返回类型
fun_name 为函数名
括号中的是形式函数
{ }括起来的是函数体
函数体描述的是,函数完成任务的过程
2.2函数的举例
eg:写一个加法函数,完成两个整形变量的加法操作
注意:
1>函数名是自定义的,根据实际情况起名字
2>参数的个数也是根据实际情况来决定,可以有0个参数,也可以有多个参数
3>函数的返回值,函数可以返回值,也可选择不返回,根据实际情况来写
4>当函数不返回值的时候,返回类型写void
三,实参和形参
3.1实参
函数调用时,传递给函数的参数就是实参(上方代码中的Add(a,b)其中a和b就为实参)
3.2形参
在自定义函数中若只是定义了Add函数而不去调用的话,Add函数的参数x和y只是形式上存在的,不会向内存申请空间,不会真实存在的,所以称为形式参数。(上方代码中的int Add(int x,int y)其中的x和y)
当实参传递给形参的时候,形参是实参的一份临时拷贝。
对于形参的修改,是不会影响实参的。
四,return语句
4.1 return 后可以跟一个数值或者表达式,若为表达式时先执行表达式,再返回表达式的结果
4.2 return 后也可以什么都没有,直接写return;这种写法适合函数返回类型时void类型
4.3 return返回的值和函数返回类型不一致系统将会自动返回的值隐式转换为函数的返回类型
4.4 return 语句执行后,函数就彻底返回,后面的代码不再执行。(如4.2自定义函数)
4.5 如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
补:
1.函数的表达类型
1> 函数的返回类型可以是char,int,short,double...(内置类型),也可以是自定义类型。
2>函数的返回类型也可以是void,void的意思就是不需要返回函数,也不返回值。
3>函数与不需要返回值,是根据实际情况来设计的。
2.函数参数
1>函数的参数可以只有0个,也可以有多个,根据实际情况来确定
2>参数的类型只要是合法的类型,char,int,flaot,double...内置类型,也可以是自定义类型
3>函数的参数如果是0个,也就是不需要参数的时候,函数的参数类型可以写成void,void在这里表示函数没有参数,也不需要参数。
3.函数的返回类型如果什么都不写,默认函数的返回类型是int
五,数组做函数参数
注意:
1.函数的形式参数要和函数的实参个数匹配
2.函数的实参是数组,形参也是可以写成数组形式的
3.形参如果是一维数组,数组大小可以省略不写
4.形参如果是二维数组,行可以省略,但是列不能省略
5.数组传参,形参不会创建新的数组的
6.形参操作的数组和实参的数组是同一个数组
六,嵌套调用和链式访问
6.1嵌套调用
嵌套调用就是函数之间的相互调用
6.2链式访问
所谓链式访问就是将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来就是函数的链式访问。
补充:
1.printf的返回值:若成功返回时,将返回写入的字符总数。
2.空格也算一个字符。
eg:
第一次显示为43,第二次显示为2(因为43是两个字符),第三次显示为1(因为2是一个字符)
第一次显示43,第二次显示3(先显示空格,然后再显示43这两个字符),第三个同理。
七,函数的声明和定义
7.1 单个文件
在C语言中规定,函数要先声明再使用。
函数定义 -- 是一种特殊的声明
当自定义函数在main函数后面时要声明函数!!!
7.2 多个文件
1.分模块写的好处
1>逻辑清晰
2>方便协作
3>一个模块又拆分为.h和.c是方便代码的隐藏
例:
7.3 static和extern
static 和 extern 都是C语言中的关键字
static 是静态的 的意思,可以用来:
修饰局部变量
修饰全局变量
修饰函数
extern 是用来声明外部符号的
补:
1> 作用域
作用域是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效(可用)的,而限定这个名字的可用性代码范围就是这个名字的作用域。
1.1 局部变量的作用域是变量所在的局部范围
1.2 全局变量的作用域是整个工程
eg;局部变量演示
a无法显示的原因:a只能在所在范围内的大括号里面显示,如下图所示
b的范围相对与a而言作用域范围大,但b和a同为局部变量。
eg:全局变量
c为全局变量(相当于现实中的共享单车)
2>生命周期
生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段
2.1 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束
2.2 全局变量的生命周期是:整个程序的生命周期
eg:局部变量生命周期
从创建开始到销毁结束生命周期结束。
eg:全局变量的生命周期
随main函数起,随main函数终。
7.3.1 static修饰局部变量:
结果为2 2 2 2 2。
加上static后所显示为:
static修饰局部变量:
本质上影响了变量的存储类型,一个局部变量是存在栈区的,但是被static修饰后就存放在静态区了,因为存储类型的变化,生命周期跟着变化了,变长了。
注意:a的作用域不变。
7.3.2 static修饰全局变量:
当加上static时:
static修饰全局变量
1.全局变量是具有外部链接属性的
2.全局变量被static修饰后,外部属性就变成了内部连接属性,就是这个全局变量只能在自己所在的.c文件中使用,其他文件看不到。(相当于作用域变小了)
7.3.3 static修饰函数:
当加上static时
static 修饰函数:(和全局变量相似)
1.函数也是具有外部链接属性
2.但是被static修饰后,外部链接属性就变成了内部链接属性,这个函数只能在自己所在的.c文件中使用,其他文件中即使声明了,也不能使用。