函数
正⽂开始
1.函数(function)的概念
我们都知道函数是数学里的重要组成部分,数学中我们常见到函数的概念,但是你了解C语言中的函数吗?其实函数就相当于一个子程序,那什么是子程序呢?
子程序解释如下:
- 在计算机科学中,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。
- 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
简单的来说,C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的,也可以说:⼀个⼤的计算任务可以分解成若⼲个较⼩的函数(对应较⼩的任务)完成。同时⼀个函数如果能完成某项特定任务的话,这个函数也是可以复⽤的,提升了开发软件的效率。
2.库函数
2.1标准库和头⽂件
问:那什么是库函数呢?
答:其实库函数就是存放在函数库中的函数,具有明确的功能、入口调用参数和返回值。
问:库函数是C语言提供的吗?
答:不是,C语言标准中约定好,由编译器提供的函数库。
问:为什么会有库函数?
答:为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
2.1.1 C语言标准库
C语言标准库是一组预定义函数、宏和文件的集合,这些函数和文件提供了一些基本的功能和操作,可供C语言程序使用。C语言标准库由C语言的制定者定义,并包含在C语言的编译器中。
C语言标准库包含了许多常见的功能,例如输入和输出操作、字符串处理、内存管理、数学运算、日期和时间处理等。它为C程序员提供了一些基本的工具,使他们能够更方便地开发应用程序。
一些常见的C语言标准库包括stdio.h(用于输入和输出操作)、stdlib.h(用于内存管理和其他实用函数)、string.h(用于字符串处理)、math.h(用于数学计算)等。这些库函数可以通过包含相应的头文件来访问,并通过调用库函数来实现所需的功能。
前面的描述似乎还不够清晰,再详细一点,C语言标准库包含以下几个部分:
头文件(Header Files):C语言标准库包含一系列的头文件,用于声明函数原型、定义常量和数据类型等。开发者可以通过包含适当的头文件来使用标准库中提供的函数和类型。
静态库(Static Libraries):C语言标准库还以静态库的形式提供,其中包含了标准库函数和类型的实现代码。静态库是在编译时与应用程序一起链接,使得应用程序可以调用标准库提供的函数和类型。
动态库(Dynamic Libraries):一些操作系统和编译器还提供了C语言标准库的动态库版本。动态库是在运行时被应用程序动态加载和链接的库。应用程序可以共享同一个动态库的实例,从而节省内存,并且可以在库的更新时实现简单的升级。
2.1.2库函数的使⽤⽅法
库函数相关头文件:C 标准库头文件 - cppreference.com
C/C++官方链接:C 标准库头文件 - cppreference.com
cplusplus.com:C library - C++ Reference
3.⾃定义函数
3.1函数的语法形式
其实⾃定义函数和库函数是⼀样的。
形式如下:
ret_type fun_name(形式参数)
{
语句;
}
•ret_type是函数返回类型
•fun_name是函数名
•括号中放的是形式参数
•{}括起来的是函数体
4.形参和实参
4.1实际函数(实参)
•实际参数就是真实传递给函数的参数。
•实参可以是:常量、变量、表达式、函数等
4.2形参
•形式参数只有在函数被调⽤的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形参的实例化。
•形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
•我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝
4.3实参和形参的关系
虽然我们提到了实参是传递给形参的,他们之间是有联系的,但是形参和实参各⾃是独⽴的内存空间。
5.return语句
5.1return语句使⽤的注意事项。
•return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式的结果。
•return后边也可以什么都没有,直接写return;这种写法适合函数返回类型是void的情况。
•return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
•return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。
•如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
6.数组做函数参数
6.1这⾥我们需要知道数组传参的⼏个重点知识:
•函数的形式参数要和函数的实参个数匹配
•函数的实参是数组,形参也是可以写成数组形式的
•形参如果是⼀维数组,数组⼤⼩可以省略不写
•形参如果是⼆维数组,⾏可以省略,但是列不能省略
•数组传参,形参是不会创建新的数组的
•形参操作的数组和实参的数组是同⼀个数组
7.函数的声明和定义
7.1static和extern
static和extern都是C语⾔中的关键字。
7.1.1static是静态的的意思
可以⽤来:
•修饰局部变量
•修饰全局变量
•修饰函数
7.1.2extern是⽤来声明外部符号的
7.2作⽤域和⽣命周期。
7.2.1作⽤域(scope)
是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
1.局部变量的作⽤域是变量所在的局部范围。
2.全局变量的作⽤域是整个⼯程(项⽬)。
7.2.2⽣命周期
指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
1.局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
2.全局变量的⽣命周期是:整个程序的⽣命周期。