函数基础知识

  • 一、C语言中函数的分类
    • - 库函数
    • - 自定义函数
  • 二、函数的声明与定义
    • - 函数的声明
    • - 函数的定义
  • 三、函数的参数
    • - 实际参数(实参)
    • - 形式参数(形参)
  • 四、函数的调用
    • - 传值调用
    • - 传址调用
  • 五、函数的嵌套调用和链式访问
    • - 嵌套调用
    • - 链式访问
  • 六、函数递归

一、C语言中函数的分类

- 库函数

库函数:由系统建立的具有一定功能的函数的集合。程序员引用头文件后可以直接调用系统函数库中的函数进行使用。
库函数的分类:

  • IO函数(输入输出函数)
  • 字符串操作函数
  • 内存操作函数
  • 数学函数
  • 时间/日期函数
  • 其他库函数

库函数有许多,想要全部记住是十分困难的,实际上也不需要完全记住,重点是要学会如何查询与快速掌握所需库函数的用法
下面这个网站可以快速查询所需库函数的功能和用法:
    —库函数查询—

- 自定义函数

自定义函数:程序员自己创建的函数。函数的强大之处就在于程序员可以将自己创造的一个又一个相对独立的单功能代码块封装为函数,调用后便可重复使用。

函数的组成

ret_type fun_nume(para1,……)
{statement; //语句项
}ret_type  返回类型
fun_name  函数名
para1     函数参数
……        参数可以多个

二、函数的声明与定义

- 函数的声明

1、函数的声明要在函数的定义和调用之前(若将函数的定义放在main函数前,就是同时声明和定义了),要满足先声明后使用

2、函数的声明要包含返回类型,函数名,参数类型。

3、函数的声明一般放在头(.h)文件中。

//函数的声明
int Add(int, int);

- 函数的定义

函数的定义是指函数的具体实现,交代函数的功能实现。函数定义放在源(.c)文件中。

//函数的定义
int Add(int x, int y)
{return x + y;
}

三、函数的参数

- 实际参数(实参)

真实传递给函数的参数,叫实参。
实参可以为:常量,变量,表达式,函数等(实质是表达式的结果、函数的返回值 作为实参)。

- 形式参数(形参)

形参是指函数名后括号中的变量,因为形参只有在函数的调用过程中才实例化(分配内存空间),所以叫形式参数。
形参在函数调用完成后就会自动销毁,所以形参只在函数内部有效。

四、函数的调用

- 传值调用

将实参的值传递给函数中的形参。

传值调用时,形参其实是实参的一份临时拷贝,在函数内部修改形参是不会改变实参的。

- 传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数。

通过传址调用,函数的参数可以直接操作函数外部的变量,对其进行修改。

五、函数的嵌套调用和链式访问

- 嵌套调用

在函数内部调用其他函数就是函数的嵌套调用。

#include <stdio.h>
void new_line()
{printf("hehe\n");
}void three_line()
{int i = 0;for(i=0; i<3; i++){new_line();  //也是嵌套调用}
}
int main()
{three_line();  //嵌套调用return 0;
}

函数可以嵌套调用,但是不能嵌套定义(即:不能在函数内部定义函数)。

- 链式访问

链式访问:把一个函数的返回值作为另外一个函数的参数。

#include <stdio.h>
int main()
{printf("%d", printf("%d", printf("%d", 43)));//这就属于链式访问//结果是 4321,:printf函数的返回值是打印在屏幕上字符的个数return 0;
}

六、函数递归

在函数的内部调用函数自身称之为递归。

递归策略通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,然后只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的主要思考方式是:把大事化小。

实现递归的两个必备条件:

1. 递归存在限制条件,当满足限制条件时,递归便不再继续。
2. 每次递推都更加接近限制条件,最后会达到限制条件,然后开始回归。

//例:求斐波那契数列(不考虑溢出)
int fib(int n)
{if (n <= 2)         return 1;elsereturn fib(n - 1) + fib(n - 2);  //这便是递归
}

上面的代码其实存在问题:
  当 n 的数值较大时,程序会运行很久才得到答案甚至崩溃,Why?

因为 n 较大时fib函数内部要重复的次数很多,而系统分配给程序的栈空间是有限的,如果出现递归重复的次数太多,有可能导致程序一直开辟栈空间,最终产生栈空间耗尽的情况,这时便发生了栈溢出。

解决办法:用迭代(循环,非递归)的方式代替递归。

不过,在使用递归没出现错误的情况下(如栈溢出、效率过低等)一般建议使用递归,而不是使用迭代(非递归)的方式,因为递归可以比其他方式简洁很多。

下接破开C语言暗夜的第五道光 —— 数组

破开C语言暗夜的第四道光(1)—— 函数基础知识相关推荐

  1. 破开C语言暗夜的第三道光——控制语句

    控制语句 控制语句 一.分支语句 if语句 switch语句 二.循环语句 while循环 for循环 do...while循环 三.转向语句 break continue return goto语句 ...

  2. 破开C语言暗夜的第二道光 —— 数据与数据类型(1)

    标识符与常量变量 一.标识符 二.常量变量 1.变量 1-1:变量的定义 1-2:变量的命名 1-3:变量的作用域和生命周期 1-4:变量的分类 2.常量 2-1:常量的定义 2-2:常量的分类 三. ...

  3. (Java高级教程)第四章必备前端基础知识-第二节1:CSS概述和选择器

    文章目录 一:CSS概述 (1)概述 (2)语法规范 (3)CSS引入方式 二:选择器 (1)基础选择器 ①:标签选择器 ②:类选择器 ③:id选择器 ④:通配符选择器 总结 (2)复合选择器 ①:后 ...

  4. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  5. 第四章 Android WiFi基础知识

    系列文章目录 第一章 国内下载AOSP最新源码的方法 第二章 下载AOSP WiFi相关的代码 第三章 将源码导入Android Studio(无需编译idegen) 文章目录 系列文章目录 前言 一 ...

  6. C语言中常见的四个内存函数

    前言 我们为什么要用内存操作函数? 内存函数,是通过访问地址的方式操作对象,因此可应用于任何类型对象,只要按照字节操作 1. memcpy void * memcpy ( void * destina ...

  7. 计算机基础知识第四章测试,计算机基础知识测试题第四章

    第四章 电子表格Excel 一.单项选择题 1.利用"文件"菜单打开Excel 2000的文件,一次可以打开多个不连续的文件,方法是先单击一个文件名,然后按住( )键,再单击其他文 ...

  8. java语言错误的是解释运行的_Java基础知识测试__A卷_答案

    考试宣言: 同学们, 考试考多少分不是我们的目的! 排在班级多少的名次也不是我们的初衷! 我的考试的目的是要通过考试中的题目,检查大家在这段时间的学习中,是否已经把需要掌握的知识掌握住了,如果哪道题目 ...

  9. 软考高级-系统架构师-第四章系统开发基础知识

    本篇博文目录: 一.软件开发方法 1.软件开发生命周期 (1) 软件定义 (2) 软件开发 (3) 软件运行与维护 2.软件开发模型 3.敏捷方法 (1) 敏捷方法的特点 (2) 敏捷方法核心思想 ( ...

最新文章

  1. vue 用key拿对象value_vue对象添加属性(key:value)、显示和删除属性
  2. java 语言如何判断素数_C语言实验之判断素数(循环结构java)方法讲解
  3. stm32串口学习(一)
  4. 电感是怎么储存能量的
  5. Redis 安装启动
  6. python collections(容器)模块
  7. 【Vue-router中,require代替import解决vue项目首页加载时间过久】
  8. NSX产品许可介绍( 适用于vSphere 6.2.x,6.3.x和6.4.x的VMware NSX的产品产品(2145269))
  9. Extjs chart 总结 reload-chart.js 修改
  10. POJ 3264 -----RMQ问题
  11. 数据结构_满二叉树、完全二叉树、二叉排序树、平衡二叉树
  12. Java实现Unicode编码和中文互转
  13. 010 Editor逆向分析文档
  14. 【数据说·第十五期】如何对营业额数据进行分析,提升门店盈利能力?
  15. 2022-2028全球与中国电热毯市场现状及未来发展趋势
  16. springboot文件上传 Required request part 'file' is not present
  17. 计算机数字键盘无法输入数字,电脑数字键打不出数字怎么办?电脑数字键打不出数字的修复方法...
  18. 在spring.io网下下载的快速入门项目,导进去pom.xml文件爆红,报:Non-resolvable parent POM for com.tc:demo:0.0.1-SNAPSHOT: F
  19. 猿编程python分为几个阶段_python教程- 猿说python
  20. 微信美化版去水印小程序源码分享 附接口

热门文章

  1. beta阶段第八次scrum meeting
  2. 百度广告联盟申请及赚钱的技巧
  3. SCORM标准课件制作
  4. 《那些年啊,那些事——一个程序员的奋斗史》——75
  5. 【办公软件免费版】万彩办公大师教程丨PDF转Word工具
  6. 异步API中promise解决回调地狱问题和异步函数async终极解决方案
  7. oracle求同比,环比函数 LAG和LEAD
  8. PHP+MYSQL新闻系统开发之PHP100视频教程62 修正版
  9. 揭秘国内6家主流CRM产品:NPS亟待提升 兼容性制约客户体验
  10. PMP证书在面试项目经理时有加持吗?解惑