)
目录库函数与自定义函数库函数的使用方法自定义函数实参与形参return语句返回值的用处数组做函数游戏函数嵌套调用链式访问函数的定义与声明单个文件和多个文件static 和 extern一、函数的定义函数function⼦程序⼦程序这种翻译更加准确⼀些。C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。⼀个⼤的计算任务可以分解成若⼲个较⼩的函数对应较⼩的任务完成。同时⼀个函数如果能完成某项特定任务的话这个函数也是可以复⽤的提升了开发软件的效率。二、库函数官方库函数printf 、 scanf 都是库函数库函数也是函数不过这些函数已经是现成的我们只要学会就能直接使⽤了。有了库函数⼀些常⻅的功能就不需要程序员⾃⼰实现了⼀定程度提升了效率同时库函数的质量和执⾏效率上都更有保证。各种编译器的标准库中提供了⼀系列的库函数这些库函数根据功能的划分都在不同的头⽂件中进⾏了声明。库函数相关头⽂件https://zh.cppreference.com/w/c/header库函数的使用方法推荐的网站cplusplus.comhttps://legacy.cplusplus.com/reference/clibrary/例如搜索printf的用法来来来如何使用使用sqrt来计算100平方根tip库函数是在标准库中对应的头⽂件中声明的所以库函数的使⽤务必包含对应的头⽂件不包含是可能会出现⼀些问题的。例2三、自定义函数⾃定义函数其实更加重要也能给程序员写代码更多的创造性。自定义函数的语法形式ret_type fun_name(形式参数) { } //ret_type:是函数的返回类型 //fun_name:是函数名 //{}里面放的是函数体把函数想象成⼩型的⼀个加⼯⼚⼯⼚得输⼊原材料经过⼯⼚加⼯才能⽣产出产品那函数也是⼀样的函数⼀般会输⼊⼀些值可以是0个也可以是多个经过函数内的计算得出结果。ret_type 是⽤来表⽰函数计算结果的类型有时候返回类型可以是 void 表⽰什么都不返回fun_name 是为了⽅便使⽤函数就像⼈的名字⼀样有了名字⽅便称呼函数有了名字⽅便调⽤所以函数名尽量要根据函数的功能起的有意义。函数的参数就相当于⼯⼚中送进去的原材料函数的参数也可以是 void 明确表⽰函数没有参数。如果有参数要交代清楚参数的类型和名字以及参数个数。{}括起来的部分被称为函数体函数体就是完成计算的过程。函数使用的举例步骤我们根据要完成的功能给函数取名Add函数Add需要接收2个整型类型的参数函数计算的结果也是整型。所以我们根据上述的分析写出函数另一个写法okok也是完成了记得调用哦四、实参和形参函数的参数部分需要交代清楚参数个数每个参数的类型是啥形参的名字叫啥。在函数使⽤的过程中把函数的参数分为实参和形参实参在上⾯代码中第2~7⾏是 Add 函数的定义有了函数后再第17⾏调⽤Add函数的。我们把第17⾏调⽤Add函数时传递给函数的参数a和b称为实际参数简称实参。实际参数就是真实传递给函数的参数。形参在上⾯代码中第2⾏定义函数的时候在函数名 Add 后的括号中写的 x 和 y 称为形式参数简称形参。为什么叫形式参数呢实际上如果只是定义了 Add 函数⽽不去调⽤的话 Add 函数的参数 x和 y 只是形式上存在的不会向内存申请空间不会真实存在的所以叫形式参数。形式参数只有在函数被调⽤的过程中为了存放实参传递过来的值才向内存申请空间这个过程就是形参的实例化。实参和形参的关系虽然我们提到了实参是传递给形参的他们之间是有联系的但是形参和实参各⾃是独⽴的内存空间。这个现象是可以通过调试来观察的。我们在调试的时候可以观察到x和y确实得到了a和b的值但是x和y的地址和a和b的地址是不⼀样的所以我们可以理解为形参是实参的⼀份临时拷⻉。五、return语句在函数的设计中函数中经常会出现return语句这⾥讲⼀下return语句使⽤的注意事项。return后边可以是⼀个数值也可以是⼀个表达式如果是表达式则先执⾏表达式再返回表达式的结果。return后边也可以什么都没有直接写 return; 这种写法适合函数返回类型是void的情况。return语句执⾏后函数就彻底返回后边的代码不再执⾏。return返回的值和函数返回类型不⼀致系统会⾃动将返回的值隐式转换为函数的返回类型。如果函数中存在if等分⽀的语句则要保证每种情况下都有return返回否则会出现编译错误。函数的返回类型如果不写编译器会默认函数的返回类型是int。函数写了返回类型但是函数中没有使⽤return返回值那么函数的返回值是未知的。函数声明有返回类型但是代码全程没有 return 语句调用这个函数接收返回值时拿到的是内存里随机垃圾值属于未定义行为六、数组做函数参数在使⽤函数解决问题的时候难免会将数组作为参数传递给函数在函数内部对数组进⾏操作(✿◡‿◡)⽐如写⼀个函数将⼀个整型数组的内容全部置为-1再写⼀个函数打印数组的内容。1.先写主体程序2.开始编写函数set_arr3.总之以上是一维数组的下面讲二维数组数组作为参数传递给了set_arr 和 print_arr 函数了那这两个函数应该如何设计呢这⾥我们需要知道数组传参的⼏个重点知识函数的形式参数要和函数的实参个数匹配调用函数时传入实参的数量必须和函数定义时形参数量一致函数的实参是数组形参也是可以写成数组形式的形参如果是⼀维数组数组⼤⼩可以省略不写形参如果是⼆维数组⾏可以省略但是列不能省略数组传参形参是不会创建新的数组的形参操作的数组和实参的数组是同⼀个数组七、嵌套调⽤和链式访问嵌套调⽤就是函数之间的互相调⽤每个函数就像⼀个乐⾼零件正是因为多个乐⾼的零件互相⽆缝的配合才能搭建出精美的乐⾼玩具假设我们计算某年某⽉有多少天如果要函数实现可以设计2个函数is_leap_year()根据年份确定是否是闰年get_days_of_month()调⽤is_leap_year确定是否是闰年后再根据⽉计算这个⽉的天数这⼀段代码完成了⼀个独⽴的功能。代码中反应了不少的函数调⽤main函数调⽤scanf、printf、get_days_of_monthget_days_of_month函数调⽤is_leap_year未来的稍微⼤⼀些代码都是函数之间的嵌套调⽤但是函数是不能嵌套定义的。八、链式访问所谓链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数像链条⼀样将函数串起来就是函数的链式访问。前⾯的代码完成动作写了2条语句把如果把strlen的返回值直接作为printf函数的参数呢这样就是⼀个链式访问的例⼦了。九、函数的声明和定义单个文件⼀般我们在使⽤函数的时候直接将函数写出来就使⽤了。函数的调⽤⼀定要满⾜先声明后使⽤多个⽂件⼀般在企业中我们写代码时候代码可能⽐较多不会将所有的代码都放在⼀个⽂件中我们往往会 根据程序的功能将代码拆分放在多个⽂件中。⼀般情况下函数的声明、类型的声明放在头⽂件.h中函数的实现是放在源⽂件.c⽂件中。如下有了函数声明和函数定义的理解我们写代码就更加⽅便了static 和 extern在下一章节补充