函数

一、函数原型声明


1.目的

    说明函数类型和参数情况,以保证程序编译时能判断对该函数的调用是否正确。

2.一般格式

    函数类型 函数名(参数表);

3.说明

    ①函数声明是一条c语句,与函数定义时的函数首部不同,函数声明后必须加分号。

    ②当主调函数放在被调函数后面时,不需要做声明。


二、函数的调用


1.前提条件

        调用自定义函数时,程序中必须要有与调用函数相对应的函数定义。

2.调用过程

        任何C程序执行,首先从主函数main()开始,若遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后将返回主函数,然后再从原先暂停的位置继续执行。(主调函数:调用其它函数的函数;被调函数:被调用的函数。)

3.调用形式

函数名(实际参数名)

实际参数名:即实参,主调函数的参数。

说明: 即使没有实际参数也要写小括号。

4.调用方式

5.参数传递

    程序运行遇到函数调用时,实参的值依次传递给形参;参数的传递是单向的,形参的值即使改变了,也不会反过来影响实参。

实参和形参的比较:

    ①实参是主调函数的,形参是自定义函数的;两者可以同名也可以不同名。

    ②形参和实参一一对应,数量应相同,顺序应该一致。

    ③形参必须是变量;实参可以是变量、常量或表达式。

6.函数结果的返回

⑴一般形式

    return 表达式;

⑵return的作用

    ①结束函数的运行;②带着运算结果(表达式的值)返回主函数。(return只能返回一个值)

⑶说明

  ① 先求表达式的值再返回。一般情况下,表达式的类型与函数类型应该一致,若不一致,以函数类型为准。②可以有多个return。③若没有return,也碰到最后的大括号自动返回,但是不会把值传给主函数。


三、函数的定义

1.定义

    函数就是一个完成特定工作的独立程序模块。

2.分类

    分为库函数和自定义函数。

3.一般格式

    函数类型  函数名(形式参数表)/*函数首部*/

    {  函数实现过程  /*函数体*/  }

⑴函数首部:

①构成:ⅰ函数类型:函数结果返回的类型,一般与return语句中表达式的类型一致。

                ⅱ函数名:函数整体的称谓,用合法标识符表示。

                ⅲ形参表:给出了函数计算所要用到的相关已知条件,以类似变量的形式给出(格式是类型1 形参1,类型2 形参2)。每个形参(形参:函数定义时,位于其首部的参数,用于接收参数传来的值。)前面的类型必须标明。函数的形参可以是一个或多个,也可以没有。

  ② 注意事项:ⅰ函数首部后面不可加分号;ⅱ只有必须从主函数中得到的已知条件,才能定义成形参;

⑵函数体

        体现函数的实现过程,有一对大括号内的若干语句组成,用一完成特定的工作,并用return语句返回运算结果。


四、不返回结果的函数


1.格式

viod 函数名(形参表)            /*函数首部*/

{    函数实现过程                          /*函数体*/  }

2.说明

    ①函数体中return可以省略;

    ②在函数定义时void不可省略,否则默认为int类型;

    ③不可能出现在表达式中,通常以独立的调用方式体现;

3.作用

    简化主函数结构。


五、局部变量和全局变量


1.局部变量

⑴定义

    C语言中把定义在函数内部的变量(或复合语句中的变量)称之为局部变量。

⑵作用

    避免各个函数之间的变量的相互干扰,在结构化程序设计中作用显著。

⑶位置

    一般定义在函数(或复合语句)的开始处,标准C规定不能定义在中间位置。

⑷说明

    ①局部变量的有效作用范围只局限于所在函数的内部;

    ②形参是局部变量。

2.全局变量

⑴定义

    在函数外而不属于任何函数的变量称为全局变量。

⑵作用

    解决了多个函数间的变量共用;解决函数多结果返回的问题。作用范围是从定义开始到程序所在文件的结束,它对作用范围内所有函数起作用。

⑶位置

  既可定义在程序头部,又可定义在两个函数中间或程序尾部, 一般情况下定义在程序的最前面,即第一个函数前。

⑷说明

全局变量更多的用于多函数间的全局数据表示。

3.二者之间的联系

    ①允许二者同名;

    ②二者同名时,在该函数中的全局变量不起作用,而由局部变量起作用;对其他不存在同名变量的函数,全局变量仍起作用。

    ③全局变量与复合语句中的局部变量同名时,以复合语句为准。

    ④虽然全局变量很好,但我们应更宠爱局部变量和函数参数。


六、变量生存周期和静态局部变量


1.自动变量

⑴定义

        把局部变量成为自动变量,即函数被调用时,系统自动为其分配储存单元,而一旦该函数调用结束(不一定是整个程序运行结束),所有分配给自动变量的单元将回收。

⑵格式

auto 类型名 变量表;

⑶说明

    ①在定义自动变量时,auto可以省略。

    ②当main()函数中,由于main()未运行结束,局部变量仍然存在,还在生存周期中。(变量生存周期,即变量从定义开始分配储存单元,到运行结束储存单元被回收的整个过程。)但由于变量的作用范围,使得main()中的局部变量单元不能在其他函数中使用。只有回到主函数中,那些局部变量才可继续使用。

2.变量储存的内存分布

⑴分类

    分为静态储存区和动态储存区(使用堆栈来管理)。

3.静态局部变量

⑴定义

        放在静态储存区,不会向局部变量那样被系统回收,生存周期会持续到程序结束。一旦静态局部变量的函数被再次调用,静态局部变量就会被激活。

⑵格式

static 类型名 变量表

⑶说明

    ①静态变量赋初值只在函数第一次调用时起作用,若定义时没有赋初值,系统将自动赋0;

    ②受变量作用范围限制,不能作用其他函数(包括主函数)。

⑷静态变量与全局变量

    ①共同点是生存周期都是贯穿整个程序;

    ②区别在于作用范围不同。

你可能感兴趣的:(函数)