一、函数
1、函数的意义
定义函数使功能更加模块化
定义函数的时候以功能为目的,根据功能定函数的参数和返回值
2、函数的分类
2.1 从定义角度分类 (即函数是谁实现的)
库函数 (C库实现的)
自定义函数 (程序员自己实现的函数)
系统调用 (操作系统实现的函数)
2.2 从参数角度分类
有参函数
无参函数
2.3 从返回值角度分类
带返回值的函数
没返回值的函数
3、函数的定义
函数的定义 即 函数的实现
定义方法:
返回值类型 函数名字( [形参 , 形参] )
{
// 函数体,即函数的功能
}
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数
所有函数的定义都是平行的
4、函数的声明
4.1 函数的声明: 对已经定义的函数 进行说明
函数的声明可以声明多次
4.2 声明的意义:
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数
因为编译器在编译C程序的时候,从上往下编译
4.3 什么时候需要声明 及 声明方法:
(1)主调函数和被调函数在同一个.c文件时
被调函数在下,主调函数在上
声明方法1 (直接声明)
将被调函数的第一行拷贝过去,后面加分号
void called_func ( ) ;
声明方法2 (间接声明)
将被调函数的声明放在头文件中,
在主调函数的.c中包含头文件即可
#include "called_func.h"
(2)主调函数和被调函数不在同一个.c文件时
声明方法1(直接声明) 加 extern (外部的意思)
将被调函数的第一行拷贝过去,后面加分号, 前面加 extern
extern void called_func ( ) ;
声明方法2 (间接声明)
将被调函数的声明放在头文件中,
在主调函数的.c中包含头文件即可
#include "called_func.h"
把 extern void called_func ( ) ;声明搬到called_func.h中,然后包含.h
一般来说,定义一个.c后,需要添加一个对应的.h文件,里面写的是对.c的声明。
需要用.c中的函数,只需要加入对应.h的头文件
5、函数的调用
有返回值的函数调用
变量=函数名([形参])
num = max(a,b);
无返回值的函数调用
函数名([形参])
show_message();
6、使用函数的好处
定义一次,可以多次调用,减少代码的冗余度
使代码模块化,方便调试,方便阅读
二、变量
1、普通的全局变量
就是 在函数外定义的变量
定义普通全局变量,如果不赋初值,默认为0
作用范围:
程序的所有地方
在用之前需要声明(另一个文件中声明方法 extern int num;)
声明的时候不要赋值
生命周期:
程序运行的整个过程,一直存在,直到程序结束
2、静态的全局变量
就是 在函数外定义的加 static 修饰的 变量
定义静态局部变量,如果不赋初值,默认为0
作用范围:
只在定义该变量的.c(源文件)中有效
生命周期:
程序运行的整个过程,一直存在,直到程序结束
3、普通的局部变量
就是 在 函数里面 或者 复合语句 中定义的变量
**定义普通局部变量,如果不赋初值,默认为 随机 **
作用范围: 在哪里定义的,在哪里有效
在函数中定义的变量,在该函数中有效
在复合语句中定义的变量,在复合语句中有效
生命周期:
在函数调用之前,局部变量不占用空间,
调用函数的时候,才会给局部变量开辟空间,函数结束了,就释放局部变量的空间
下一次调用的时候,重新开辟空间
4、静态的局部变量
就是 在 函数里面 或者 复合语句 中定义的加 static 修饰的 变量
定义静态局部部变量,如果不赋初值,默认为 0
作用范围: 在哪里定义的,在哪里有效
在函数中定义的变量,在该函数中有效
在复合语句中定义的变量,在复合语句中有效
生命周期:
第一次调用的时候,开辟空间赋值,函数结束后,不释放,
以后再调用的时候,就不再为其开辟空间,也不赋初值
变量重名问题
在同一作用范围内,不允许变量重名
作用范围不同的可以重名
局部范围内,重名的全局变量不起作用(就近原则)
三、特殊的函数
1、外部函数
就是普通的函数,
即函数可以在程序的任何一个文件中调用
2、内部函数
返回值类型前面加了static的函数,
只能被它所在的.c 中的函数调用