定义函数使功能更加模块化
定义函数的时候以功能为目的,根据功能定函数的参数和返回值
库函数 (C库实现的)
自定义函数 (程序员自己实现的函数)
系统调用 (操作系统实现的函数)
有参函数
无参函数
带返回值的函数
没返回值的函数
函数的定义 即 函数的实现
定义方法:
返回值类型 函数名字( [形参 , 形参] )
{
// 函数体,即函数的功能
}
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数
所有函数的定义都是平行的
函数的声明可以声明多次
有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数
因为编译器在编译C程序的时候,从上往下编译
(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的头文件
有返回值的函数调用
变量=函数名([形参])
num = max(a,b);
无返回值的函数调用
函数名([形参])
show_message();
定义一次,可以多次调用,减少代码的冗余度
使代码模块化,方便调试,方便阅读
就是 在函数外定义的变量
定义普通全局变量,如果不赋初值,默认为0
作用范围:
程序的所有地方
在用之前需要声明(另一个文件中声明方法 extern int num;)
声明的时候不要赋值
生命周期:
程序运行的整个过程,一直存在,直到程序结束
就是 在函数外定义的加 static 修饰的 变量
定义静态局部变量,如果不赋初值,默认为0
作用范围:
只在定义该变量的.c(源文件)中有效
生命周期:
程序运行的整个过程,一直存在,直到程序结束
就是 在 函数里面 或者 复合语句 中定义的变量
**定义普通局部变量,如果不赋初值,默认为 随机 **
作用范围: 在哪里定义的,在哪里有效
在函数中定义的变量,在该函数中有效
在复合语句中定义的变量,在复合语句中有效
生命周期:
在函数调用之前,局部变量不占用空间,
调用函数的时候,才会给局部变量开辟空间,函数结束了,就释放局部变量的空间
下一次调用的时候,重新开辟空间
就是 在 函数里面 或者 复合语句 中定义的加 static 修饰的 变量
定义静态局部部变量,如果不赋初值,默认为 0
作用范围: 在哪里定义的,在哪里有效
在函数中定义的变量,在该函数中有效
在复合语句中定义的变量,在复合语句中有效
生命周期:
第一次调用的时候,开辟空间赋值,函数结束后,不释放,
以后再调用的时候,就不再为其开辟空间,也不赋初值
变量重名问题
在同一作用范围内,不允许变量重名
作用范围不同的可以重名
局部范围内,重名的全局变量不起作用(就近原则)
就是普通的函数,
即函数可以在程序的任何一个文件中调用
返回值类型前面加了static的函数,
只能被它所在的.c 中的函数调用