不知不觉,小刘已经讲了十一天C语言了,语法、数据结构、数组、结构体、指针的概念和使用大家都已经了然于心,但是想用C语言开发一个有用的程序还需要一个很关键的部分,那就是编写“函数”。

“函数这个名字大家肯定都不陌生,数学中很常见。例如f(x)=x+1,这就是一个函数的表达式。其中f称为映射法则,它可以用很多其他符号来表示,括号中的x是函数的一个参数,或者叫自变量,通过等号右边的式子,对参量进行运算,最终得到的值就是通过函数想要最终得到的结果。C语言中的函数也可以从数学中的函数进行类别。”

“首先C语言中函数的定义如下:”

函数类型 函数名(形式参数){

函数体;

return 返回值(与函数的类型一致);

}

“其中函数类型和函数返回值的类型是一致的,形式参数是在函数体中才有效的,函数外则无效,通常我们想要拿一个变量到函数中进行运算,那么我们在调用函数的时候,将实际参数的位置放到与形式参数对应的位置即可,如果你的函数不需要传入其他的参数,在定义时括号中也可以什么都不写。”

“下面我们通过一个例子来体验一下函数的作用:”

#include<stdio.h>
int main(){int a=1;printf("a=%d",a);return 0;
} 

输出:

“有的同学可能会有疑问,这也没定义函数啊,函数在哪呢?”

“我给大家看一张图大家就明白了:”

C语言项目组织方式 :

[图片来源:](C语言中文网:C语言程序设计门户网站(入门教程、编程软件))

“其实一个C语言的项目就是由一个个文件构成的,源文件里面装的就是源代码,那么项目的功能是怎么通过代码实现的呢,答案就是:通过函数实现功能。C语言项目的主要工作就是写函数。”

“其中main()也是函数,只不过他是一个比较特殊的函数,人称:主函数。主函数就是程序的起点,所有其他函数必须在主函数中才能实现调用。当然,我们初学时写的程序功能比较简单而且是一次性的结果(无需重复使用该功能),就可以直接写在主函数中去实现。如果我们想要求一个比较复杂的问题并且此功能还要去重复使用,那么我们通常定义一个函数来解决。如:求1~n的和用函数的方法来实现:”

code_1:void类型

#include<stdio.h>void sum(int n){int sum=0;for(int i=1;i<=n;i++){sum+=i;}printf("%d\n",sum);
}int main(){int n=0;scanf("%d",&n);sum(n);return 0;
} 

code_2:int类型

#include<stdio.h>int sum(int n){int sum=0;for(int i=1;i<=n;i++){sum+=i;}return sum;
}int main(){int n=0;scanf("%d",&n);printf("%d",sum(n));return 0;
} 

code_3:无参型

#include<stdio.h>int sum(){int n=0;scanf("%d",&n);int sum=0;for(int i=1;i<=n;i++){sum+=i;}return sum;
}int main(){printf("%d",sum());return 0;
} 

“上面三种就是函数定义和调用的实例,可以发现这些函数都是写在主函数main上面的,如果把函数写在主函数下面可不可以呢?”

“如果我们把函数直接写在main函数的下面会发生报错,说没有找到“sum”函数,那该怎么办呢?不用急,我们只要在主函数上面或者里面对函数声明一下,就可以了。”

函数声明语法:

函数类型 函数名(形式参数<无参即不用填>);

如:

或:

“C语言中函数的定义都是相互独立的,就是不能在一个函数中定义另一个函数,在语法上是不允许的,如:”

“函数的调用除了在main函数中使用以外,还可以在其他函数中使用或者在自身函数中使用。其他函数中相互使用时函数的调用的函数必须是先声明或者先写好的,否则语法不会通过。函数调用自身还有一种说法叫“递归”,下面我们就来了解一下递归。”

#include<stdio.h>void print(int n){ printf("%d,",n);if(n!=0){return print(--n);}
}int main(){int n;scanf("%d",&n);print(n);return 0;
}

“上面的例子中print函数重复调用了多次,就是一种递归:”

“递归虽然是一种巧妙的函数调用方式,但是也有巨大的问题,那就是空间或者时间开销很大:”

空间:

递归函数内部嵌套了对自身的调用,除非等到最内层的函数调用结束,否则外层的所有函数都不会调用结束。通俗地讲,外层函数被卡主了,它要等待所有的内层函数调用完成后,它自己才能调用完成。

时间:

每次调用函数都会在栈上分配内存,函数调用结束后再释放这一部分内存,内存的分配和释放都是需要时间的。
每次调用函数还会多次修改寄存器的值,函数调用结束后还需要找到上层函数的位置再继续执行,这也是需要时间的。
所有的这些时间加在一起是非常恐怖的。

“因此,掌握了递归的同时,更重要的是如何使用递归。”

学长教你学C-day12-C语言函数相关推荐

  1. c语言52单片机液晶屏显示,[手把手教你学51单片机C语言教程]22 LCD12864液晶屏显示.pdf...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspC/C++资料 [手把手教你学51单片机C语言教程]22 LCD ...

  2. c语言怎么编程输出相框,手把手教你学PIC单片机C语言教程第1课.PDF

    手把手教你学PIC单片机C语言教程第1课 - PIC HL-K18 - PIC HL-K18 慧净电子--做人人都买得起的PPIICC单片机开发板真诚为你服务,基于HHLL--KK1188 开发板 手 ...

  3. 学长教你学C-day5-C语言变量与数据类型

      小韩是一个学习比较刻苦认真的学生,虽然老师上课进度刚讲到输入输出,但是小韩已经自学到C语言指针部分的内容了.但是进度太快的弊端就是有些东西很难消化吸收,这不就遇到了问题,来请教小刘:"学 ...

  4. 学长教你学C-day8-C语言三大基本运算符

      "同学们,大家学会了内存和指针以后C语言应该没什么能难倒大家的了,今天我们就来学点简单的,C语言中的基本运算符,分别是算数运算符.关系运算符合逻辑运算符.算数运算很简单你可以理解为我们小 ...

  5. 学长教你学C-day10-C语言数组

      "同学们,我们前面讲过了变量和数据类型,我们来复习一下,用C语言变量存储数据1~10,然后再输出.小明小红你们上黑板来写,其他人写纸上就可以."   小明和小红走向讲台拿起粉笔 ...

  6. 手把手教你学51单片机-c语言版期末考试,手把手从零教你学51单片机

    课程简介: 51单片机的教程及开发板真的很多,我曾经也从零学单片机,看过的视频教程及玩过的开发板也比较多,但很多都是为了卖发板而做视频教程.从头到尾的就每个模块做些例子,或者就送些例子,而例子中所涉及 ...

  7. 数码管动态显示c语言,《手把手教你学51单片机-C语言》之六 中断与数码管动态显示...

    中断是单片机系统重点中的重点,因为有了中断,单片机就具备了快速协调多模块工作的能力,可以完成复杂的任务.本章将首先带领大家学习一些必要的C语言基础知识,然后讲解数码管动态显示的原理,并最终借助于中断系 ...

  8. 手把手教你学51单片机-C语言基础

    二进制.十进制和十六进制 对于二进制来说,8 位二进制我们称之为一个字节. 我们在进行 C 语言编程的时候,我们只写十进制和十六进制,那么不带 0x 的就 是十进制,带了 0x 符号的就是十六进制. ...

  9. 秀琴教你学(MySQL—DDL语言篇、MySQL常见数据类型)

    目录 一.SQL语言 二.数据库操作 2.1.库的核心语句 2.2库的使用实例: 三.DDL数据定义语言:表的核心语句与使用 3.1.表的核心语句 3.2.使用实例 四.MySQL常见数据类型 4.1 ...

最新文章

  1. 苏州大学计算机科学与技术研究生分数线,【图片】18年苏州大学计算机872考研经验分享【苏州大学研究生吧】_百度贴吧...
  2. Stanford UFLDL教程 可视化自编码器训练结果
  3. C++ 类中的static成员的初始化
  4. php转换图片为.bin文件
  5. 程序员的十个层次 你属于哪一层?小菜看后
  6. 未发现android设备,Brother iPrintScan 应用程序上出现错误信息“未发现支持设备”(Android™ 智能手机)。...
  7. c语言掌握常用函数,c语言一些常用函数.pdf
  8. 白话debounce和throttle
  9. java字节输出流方法,Java-IO:File和字节输入输出流
  10. VSCode Debug
  11. Android 逆向分析(三)之动态调试Smali
  12. 自然电位测井 基本原理、测量方法、曲线规律、曲线用途
  13. Mybatis-Plus:Sql 注入器(扩展BaseMapper)
  14. mysql的chakan biao_MySQL_Mysql中文汉字转拼音的实现(每个汉字转换全拼),一、创建拼音对照表 复制代 - phpStudy...
  15. 计算机教师专业环境,信息技术环境对教师专业发展的新要求
  16. 虚拟机VMware安装Ubuntu记录
  17. Form认证timeout无效问题
  18. Redis基础与高可用集群架构进阶详解
  19. MOSFET的误启动发生机制-3
  20. 球差透射电镜测试样品的优势有哪些?

热门文章

  1. Linux之关闭大页【即关闭透明大页】
  2. 校园人脸识别安全系统有哪些功能
  3. openjudge 马走日
  4. Synopsys coreConsultant
  5. PHP连接数据库的一些操作步骤
  6. 掌握python语言可以做什么?十大应用领域介绍
  7. sql语句中如何将datetime格式的日期转换为yy-mm-dd格式
  8. 分享||元器件类别分类的标准
  9. 填入c语言,试题五(共 15分) 阅读以下关于 C语言及 C代码的叙述 回答问题 1至问题 3 将答案填入答题纸的对...
  10. xp系统如何连接投影仪