c语言-函数

作者: 一只小蝉儿 | 来源:发表于2016-05-29 17:20 被阅读179次

    一、函数的分类

    C语言的函数可以大概分为3类:
    1、主函数,也就是main函数。每个程序中只能有一个、也必须有一个主函数。无论主函数写在什么位置,C程序总是从主函数开始执行
    2、开发人员自定义的函数,可有可无,数目不限
    3、C语言提供的库函数,例如stdio.h中的输出函数printf()和输入函数scanf()

    二、函数的声明和定义

    1、在Java中,每个方法的定义顺序没有限制,在前面定义的方法内部可以调用后面定义的方法


    屏幕快照 2016-05-29 17.00.04.png

    2、在标准C语言中,函数的定义顺序是有讲究的,默认情况下,只有后面定义的函数才可以调用前面定义过的函数


    屏幕快照 2016-05-29 17.01.10.png
    3、如果想把其他函数的定义写在main函数后面,而且main函数能正常调用这些函数,那就必须在main函数前面作一下函数的声明
    屏幕快照 2016-05-29 17.05.30.png

    函数的声明格式:
    返回值类型 函数名 (参数1, 参数2, ...)
    4、在大型的C程序中,为了分模块进行开发,一般会将函数的声明和定义(即实现)分别放在2个文件中,函数声明放在.h头文件中,函数定义放在.c源文件中
    下面我们将sum函数的声明和定义分别放在sum.h和sum.c中
    sum.h文件


    13142214-ddc2655992164e4ea06c400bde033b7c.png
    sum.c文件
    13142245-61cd06d8463a457da589949e9e2fc83c.png
    然后在main.c中包含sum.h即可使用sum函数
    16103018-095d4be12c9e47fc900f889c28926422.png
    其实sum.h和sum.c的文件名不一样要相同,可以随便写,只要文件名是合法的
    运行步骤分析:
    1> 在编译之前,预编译器会将sum.h文件中的内容拷贝到main.c中

    2> 接着编译main.c和sum.c两个源文件,生成目标文件main.obj和sum.obj,这2个文件是不能被单独执行的,原因很简单:
    a、sum.obj中不存在main函数,肯定不可以被执行
    b、 main.obj中虽然有main函数,但是它在main函数中调用了一个sum函数,而sum函数的定义却存在于sum.obj中,因此main.obj依赖于sum.obj
    3> 把main.obj、sum.obj链接在一起,生成可执行文件
    4> 运行程序
    说到这里,有人可能有疑惑:可不可以在main.c中包含sum.c文件,不要sum.h文件了?


    13153525-f3a07fb4d0e941d294a590bd4232f4b1.png
    大家都知道#include的功能是拷贝内容,因此上面的代码等效于:
    13153533-efd9adbd81f54350897323062c546ca7.png
    这么一看,语法上是绝对没有问题的,但是绝对运行不起来,在链接时会出错。原因:编译器会编译所有的.c源文件,这里包括main.c、sum.c,编译成功后生成sum.obj、main.obj文件,当链接这两个文件时链接器会发现sum.obj和main.obj里面都有sum函数的定义,于是报"标识符重复"的错误。
    有人可能觉得分出sum.h和sum.c文件的这种做法好傻B,好端端多出2个文件,你把所有的东西都写到main.c不就可以了么?
    没错,整个C程序的代码是可以都写在main.c中。但是,如果项目做得很大,你可以想象得到,main.c这个文件会有多么庞大,会严重降低开发和调试效率。
    要想出色地完成一个大项目,需要一个团队的合作,不是一个人就可以搞的定的。如果把所有的代码都写在main.c中,那就导致代码冲突,因为整个团队的开发人员都在修改main.c文件,张三修改的代码很有可能会抹掉李四之前添加的代码。
    正常的模式应该是这样:假设张三负责编写main函数,李四负责编写一系列的自定义函数,张三需要用到李四编写的某个函数,怎么办呢?李四可以将所有的函数声明在一个.h文件中,比如lisi.h,然后张三在他自己的代码中包含lisi.h文件,接着就可以调用lisi.h中声明的函数了,而李四呢,可以独立地在另外一个文件中(比如lisi.c)编写函数的定义,实现那些在lisi.h中声明的函数。这样子,张三和李四就可以相互协作、不会冲突。

    三、函数的形参和实参

    在定义函数时,函数名后面的()中定义的变量称为形式参数(形参);在调用函数时传入的值称为实际参数(实参)。


    屏幕快照 2016-05-29 17.19.51.png

    如果是基本数据类型作为函数的形参,那是简单的值传递,将实参a的值赋值给了形参b,相当于
    int a = 10;
    int b = a;
    b = 9;

    相关文章

      网友评论

        本文标题:c语言-函数

        本文链接:https://www.haomeiwen.com/subject/jcsqdttx.html