C语言入门:基础篇06 函数

函数:Function

        含义: 一段具有某一项功能的代码集合,函数是c语言管理代码的最小单位

        好处:把代码封装成一个个函数后,可以方便管理和调用代码。


一、函数分类:

1.1 标准库函数:

        C语言标准委员会以函数形式提供的一些基础功能,都被封装在libc.so中,并且分在了不同的文件中,需要使用时只要把对应的头文件导入即可(例如stdio.h),然后通过具体的函数名(参数)即可完成调用。

例如:

                   #include <time.h>

                   time_t time(time_t *tloc)

        功能:获取自1970-1-1 0:0:0到调用时间的

        使用:time_c sec=time(NULL);

                   #include <stdlib.h>

                   int rand(viod)

        功能:产生伪随机数

                   void srand(unsigned int seed)

        功能:种随机种子。设置从随机数内存的每个位置开始取随机数,为了实现类似真随机的效果,seed位置一般使用time(NULL)来设置。

                    int system(const char *command)

        功能:执行系统命令command

        使用:system(“系统命令“)

        *注意:目前任何编程语言和系统都没有真正的随机数,C编译器是吧从0~极大值范围的数值打乱后存储到一块固定的内存中,然后从里面取所谓的随机数           

1.2系统函数

        系统函数是操作系统以函数形式提供的一些功能接口,但是系统函数不是真正的函数。

第三方库函数:

        是一些开源或收费的第三方库函数,Github  

  例如:

        md5 加密

        json 序列化和反序列化

        glog 谷歌日志系统

        XML 配置文件解析程序

1.3自定义函数

        为了更好的管理代码,减少代码冗余,把代码封装成自定义函数

1.3.1 函数声明

        目的:为了告诉其他调用者该函数的调用格式

        格式:返回值类型名 函数名(形参类型1 形参名,形参类型2 形参名,……);

* 注意:① C语言中函数名一般全部小写,可以用下划线分隔;

             ② 如果不需要参数时,建议写void,不要空着;

             ③ 如果没有返回值,那么就写void。

1.3.2 函数定义

        函数的具体实现

        格式:返回值类型名 函数名(形参类型1 形参名,形参类型2 形参名……)

                  {

                      // 函数体

                      return [val];

                  }

1.3.3 函数调用

        函数名(实参1,实参2,……);

*注意:① 返回值会放在调用函数语句这里,应该用变量接受或者直接显示,否则再也拿不到。

            ② 使用函数需要注意的问题:函数的隐式声明。

                    在函数调用前没有任何该函数分声明或定义,就会产生隐式声明。

                    要避免产生隐式声明,在函数调用前用函数声明或定义

            ③ 如果在函数调用前完成函数定义,那么函数声明可以省略

二、函数传参

    1、函数中定义的变量属于该函数,出了该函数就不能再被别的函数直接使用

    2、实参与形参之间是以赋值的方式进行传递数据的(单向值传递:实参->形参)

    3、return语句其实是把返回值数据放入公共区域内存中(调用者和被调用者都可以访问),调用者会从该区域获取返回值;如果不写return语句,该区域会是一个随机的垃圾数据,调用者依然能拿到返回值但是无意义。

    4、数组作为函数的参数传递时,数组的长度会丢失,需要额外增加一个变量把数组的长度传递过去

        void func(int arr[],int len);

    5、当数组作为参数传递时,是”址传递”,相当于调用者与函数共享数组。

三、函数递归

1、函数自己调用自己的行为,叫做函数递归。

2、递归是分治思想的一种具体实现,就是把一个复杂而庞大的问题,分解成若干个相似的小问题,解决所有小问题,最终大问题得到解决。

3、如果函数递归缺少出口设置,容易出现类似死循环的效果,且很快内存耗光程序异常结束。

*注意:如果能用循环解决的问题,不要用递归,因为递归比循环更耗时耗内存

四、设计函数准则

        1、一般一个函数最好不要超过50行,确保一个函数只负责一项功能,降低出错概率,并且提高可读性。

        2、数据一般要由调用者提供,只把结果返回给调用者,确保函数的通用性。

        3、考虑调用者提供的非法数据,可以先判断后使用,也可以通过注释或说明来写明情况,提高函数的健壮性。