目录
函数的定义:某一个大型程序中的某部分代码,由一个或者多个语句块组成,它负责完成某项特定的任务,而且相较于其他代码,具备相对的独立性。和数学一样,一般都会输入参数和返回值,并且对于细节和过程隐藏。
在C语言中,函数分为库函数和自定义函数。
库函数
库函数的初衷就是因为有一些代码,我们总是会重复用到,比如经常
用的printf打印函数,这就是一个函数,因为打印功能总是会频繁的用到,如果每次打印都把打印的过程要写出来,那白白浪费的人力和时间太多了,所以就有了printf打印函数。
库函数的分类
库函数可以大概分为:
IO函数(输入输出函数)printf , scanf , putchar , getchar
字符串操作函数 strcmp(比较两个字符串) , strlen (计算字符串长度)
字符操作函数 toupper
内存操作函数 memcpy , memcmp , memset
时间 /日期函数 time
数学函数 sqrt pow
其他库函数
库函数
Strcpy:把第二个字符串实参拷贝给第一个实参,返回值为发生变化的字符串地址。
Printf:各式输出函数,返回值为打印字符的个数。
库函数的调用
调用函数函数也很简单,输入函数名后面加上括号,括号里一般输入函数的实参,一个函数可以有0个或者多个实参,调用并给函数提供实参后函数就会返回相应的值,比如printf(“你好!”),这个printf的实参就是“你好”,返回的结果则是在屏幕上输出“你好!”,这样就可以简单的调用一个库函数。
要注意的是,调用相应的库函数,就必须得引用包含#include该库函数相对应的头文件,比如在调用printf函数的时候就必须得在主函数前面引用包含它的头文件:#include <stdio.h>。
最实在的,遇到不会使用的函数就查,可以用MSDN,也可以访问cplusplus,也可以百度!
自定义函数
前面说到库函数是因为有某些高频重复使用到的代码所以才封装的库函数方便使用,那么库函数肯定也不能实现所有功能,所以C提供了自定义函数功能,程序员可以自己封装函数并使用。
函数的定义
自定义函数和库函数的一样,有函数名、返回值类型、和参数。不一样的是这些都是我们自己来设计。在定义一个函数的时候,先明确它的返回值类型,然后自定义标识符,也就是函数名,函数名后的括号里是这个函数的参数。确定了函数的这三个元素之后就在函数参数后面用一个大括号,大括号去编辑函数的函数体。
定义函数的时候函数名后面括号里的参数是函数的形式参数,简称形参,并不是函数体内所有需要用到的值,而是该函数计算时外部所需要传给函数的值,就好像是数学函数中的未知数。 形参的数量决定于自己的需求。
一个函数如果不写返回类型,默认返回int类型,规范写法一定要写出来。不写类型和void类型是两种概念。void也是一种类型
函数的参数
实际参数(实参)
在调用函数的时候,函数名后面的,真实传递给函数的参数叫做实际参数,简称实参。实参可以是常量,变量,表达式,甚至是函数。无论实参是什么类型的量,在进行函数调用的时候,他必须得有一个确定的值,才可以把这个值传给函数进行计算。
形式参数(形参)
形参是指在函数定义时,函数名后面的括号中的变量,因为形参只有在函数被调用的时候才会被实例化(定义变量分配内存单元),当函数被定义了,却没有调用它的时候,该函数的形参仅仅只是形式上的参数,只有在需要用到这个函数的时候,外部传入实参的值,才需要定义形参去临时存储实参的值,并且形参在函数调用结束后销毁变量,即变量生命周期结束。因此,形参只有在函数内部有效。
调用函数时,实参传给函数,形参是实参的一份临时拷贝。
形参若是数组不会创建一个真的数组在函数内部。
函数调用
在需要用函数改变外部变量的情况下就得用到传址调用,如果说只需要将变量的值给函数就让它用一下,传值调用即可。
在把一个数组传给形参的时候,不会把整个数组传过去,只会传过去数组的首个元素的地址。而这样函数收到地址的形参变量类型会是一个指针类型。可以理解为数组传参实际为 传址调用。
传值调用
传值调用就是把变量的值本身传给函数,这种情况下,形参和实参没有必然的联系,形参只是实参的一份临时拷贝,改变形参不会影响实参。
传址调用
传址调用是实参的地址传给函数,把函数外部创建变量的内存地址传给函数。这样形参的变量类型就是指针变量,然后实参和形参就建立起来真正的联系,在函数内部可以直接操作函数外部的变量。