函数是C语言的功能单位,实现一个功能可以封装一个函数来实现,定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
创新互联专注于企业营销型网站、网站重做改版、西藏网站定制设计、自适应品牌网站建设、H5开发、商城系统网站开发、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为西藏等各大城市提供网站开发制作服务。封装的目的是为了方便函数的复用,只需要在使用某个功能的时候调用该函数即可;也是为了程序的模块化,方便阅读,方便调试。
4.2函数的分类 4.2.1从定义角度分类(即函数是谁实现的)(1)库函数:C库实现的;
(2)自定义函数:程序员自己实现的函数;
(3)系统调用:操作系统实现的函数。
4.2.2从参数角度分类(1)有参函数
函数有形参,参数的数量、类型等完全取决于函数的功能,依需要实现的功能来确定。
int max(int x,int y)
{
}
int fun(int x,float y,double z)
{
}
(2)无参函数
函数没有参数,在形参出可写void,也可以不写
int fun()
{
}
int fun(void)
{
}
4.3.3从返回值角度分类(1)带返回值的函数
在定义函数的时候必须带着返回值类型,函数体中必须有return,如果没有返回值类型,默认返回整形。
char fun()//定义了一个返回字符数据的函数
{
char b = 'a';
return b;
}
fun()//没有定义返回值的类型,默认返回整形。
{
return 1;
}
(2)没有返回值的函数
定义函数时函数名前面加上void
void fun(形参表)
{
return;
}
没有返回值,不需要return。若需要使用return结束函数的调用,可用return;即可
#includeint max(int x, int y)//函数max的返回值是int类型,有两个形参x,y,函数的作用是求两个数的大值
{
int z;
if (x >y)
{
z = x;
}
else
{
z = y;
}
return z;
}
void help(void)//前面一个void表示没有返回值,后面一个void表示没有形参
{
printf("****************\n");
printf("帮助信息********\n");
printf("****************\n");
}
int main()
{
int num;
num = max(5, 10); //调用max函数,求5 和 10两个数的大值
help(); //调用help函数,help是无参函数,不需要传参
printf("%d", num);
return 0;
}
运行的结果是:
****************
帮助信息********
****************
10
4.3函数的定义返回值类型 函数名字(形参列表)
{//函数体,实现函数的功能
}
函数名字应见名知意,简洁易懂,符号C语言命名规则,不能重名。
形参必须定义类型,多个形参用逗号,分隔。
函数的定义不能嵌套,不能在一个函数体内定义另一个函数,即每个函数都是平行的。
void fun1()
{
void fun2()
{
}
}
报错:C2601 本地函数定义是非法的。
void fun1()
{
}
void fun2()
{
}
这样的定义是正确的。
4.4函数的声明1、概念:对已经定义的函数进行说明,可以声明多次
2、为什么要声明:编译器在编译C程序时是从上往下编译的,在编译到调用的函数时编译器可能不认识这个函数,所以需要对函数进行声明。
3、什么时候要声明
(1)主调函数和被调函数在同一个.c文件中时
a.被调函数再上,主调函数在下(不需要声明)
void fun(void)
{
printf("hello world\n");
}
int main()
{
fun();
}
编译器先处理了被调用的函数,已经认识了这个函数,之后再调用这个函数时就不用声明了。
b.被调函数在下,主调函数在上(需要声明)
int main()
{
fun();
}
void fun(void)
{
printf("hello world\n");
}
编译器还没有认识fun函数时就去调用了,所以这时需要声明。
声明的方法
(1)直接声明法:
将被调用的函数的第一行拷贝过去,结尾加分号。
void fun(void);
void fun(void)
{
printf("hello world\n");
}
(2)间接声明法:
将函数的声明放在头文件中,.c文件包含头文件即可,
a.c
#include#include"4_3.h"
int main()
{
fun();
}
void fun(void)
{
printf("hello world\n");
}
a.h
extern void fun(void);
(2)主调函数和被调函数不在同一个.c文件中的时候
一定要声明,声明的方法:
a.直接声明法:将被调函数的第一行拷贝过去,后面加分号,前面加extern
b.间接声明法:将函数的声明放在头文件中,.c文件包含头文件即可,
直接声明法
间接声明法:
3、分文件:主函数放在一个.c,被调函数放在另一个.c,函数的声明放在头文件中,在主调函数前用#include "xx.h"间接声明。
4.5函数的调用函数的调用方法:
带返回值的函数:变量 = 函数名(实参列表);
无返回值的函数:函数名(实参列表);
1、有无返回值
有返回值的函数需要一个变量去接收返回值,而没有返回值的函数不需要接收,
2、有无形参
有形参的函数,就把实参写在实参列表,实参可以是常量、变量,也可以是一个表达式,没有形参就不写。
形参是变量,是被调函数的局部变量。
4.6变量的存储类别 4.6.1 内存的分区1、内存:物理内存、虚拟内存
物理内存:实在存在的存储设备,内存条、硬盘等等
虚拟内存:操作系统虚拟出来的内存。
操作系统会在物理内存和虚拟内存之间做映射,32位系统下,每个进程的寻址范围是4G,地址是0x00 00 00 00~ 0x ff ff ff ff
数据存放在物理内存,我们看到的是虚拟地址。
2、运行程序时操作系统会将虚拟内存4G进行分区,方便对内存进行管理
(1)堆区:在动态申请内存的时候,在堆里开辟内存
(2)栈区:主要存放局部变量
(3)静态全局区:
a.未初始化的静态全局区:静态变量(定义时用static修饰的变量),或全局变量,没有初始化的放在此区;
b.初始化的静态全局区:全局变量、静态变量、赋过初值的放在此区。
(4)代码区:存放程序代码
(5)文字常量区:存放常量
4.6.2普通的全局变量概念:在函数外部定义的变量
int num = 100;//num没有在函数体内部定义,而是在函数外面定义的,那么num就是一个全局变量
int main()
{
}
普通全局变量的作用范围:程序的所有地方,在所在的.c文件可以不声明,而在别的.c文件调用时需要声明:extern int num;(声明的时候不要赋值)
生命周期:在程序运行的时候一直存在,直到程序结束
注意:定义普通全局变量的时候如果不赋初值,默认初值为0。
#includeint num;
int main()
{
printf("num = %d", num);
return 0;
}
运行的结果:num = 0
4.6.3 静态全局变量 static概念:定义全局变量时前面用static修饰
static int num = 100;//num就是一个静态全局变量
int mian()
{
}
静态全局变量的作用范围:只能作用在其所在的.c文件中,在其他的.c文件中不能使用。
生命周期:在程序运行的时候一直存在,直到程序结束
注意:定义静态全局变量的时候如果不赋初值,默认初值为0。
4.6.4 普通局部变量概念:在函数内部定义的,或者复合语句中定义的变量
int main()
{
int num;//普通局部变量,在函数内部定义的
{
int a;//普通局部变量,在复合语句中定义的
}
}
普通局部变量的作用范围:在函数内部定义的只在函数内部有效,而在复合语句中定义的只在复合语句中有效
生命周期:在函数调用之前,局部变量不占用空间,只在调用函数的时候才会为局部变量开辟空间,函数结束了局部变量就被释放了,在复合语句中也是如此
注意:普通局部变量不赋初值,默认的初值是随机的。
#includevoid fun()
{
int num = 3;//只在fun内部有效的局部变量
num++;
printf("num = %d\n", num);
}
void fun2(int x)//这里定义的x形参也是只在fun2内部有效的局部变量
{
x++;
printf("x = %d\n",x);
}
int main()
{
fun();
fun();
fun();
fun2(3);
fun2(3);
return 0;
}
运行的结果:
num = 4
num = 4
num = 4
x = 4
x = 4
在第一次调用fun时,为局部变量num开辟空间,在函数结束后局部变量就被释放了,所以在第二次调用fun时,num依然是原来的num。
fun2()同理。
4.6.5 静态局部变量概念:在定义局部变量时前面加static修饰
作用范围:在它定义的函数或复合语句中有效
生命周期:静态局部变量从第一次调用函数到程序结束,而不是像普通局部变量一样函数结束就释放掉。
注意:普通局部变量不赋初值,默认的初值是0。
#includevoid fun()
{
static int num = 3;//只在fun内部有效的静态局部变量
num++;
printf("num = %d\n", num);
}
int main()
{
fun();
fun();
fun();
return 0;
}
运行的结果是:
num = 4
num = 5
num = 6
变量重名的问题在完全相同的作用范围内,不允许重名;作用范围不同的可以重名;局部范围内,重名的全局变量不起作用。(就近原则)
不能定义两个同名的全局变量,在一个函数内部也不能定义两个同名的局部变量。
全局变量num,局部变量num:在函数内部只认局部变量定义的num, 不认全局变量的num。
#includeint num = 100;
int main()
{
int num = 10;
printf("num = %d\n", num);
return 0;
}
运行的结果是:num = 10
说明这里打印的num是main函数内部定义的局部变量,而不是外部定义的全局变量
4.6.6外部函数我们定义的普通函数都是外部函数,即函数可以再程序中的任何文件中调用。
声明用extern + 返回值 + 函数名 + (形参表);
4.6.7内部函数在定义函数时,static + 返回值 + 函数名 + (形参表);即用static修饰的函数成为内部函数。
static限定了内部函数的作用范围,只在所在的.c内部有效,不能在其他的.c文件中调用。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧