C语言学习(4)第四章函数-创新互联

第四章 函数 4.1函数的概念

函数是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元起,快前往官网查看详情吧


新闻名称:C语言学习(4)第四章函数-创新互联
分享URL:http://myzitong.com/article/doecco.html