函数基本概念
每个c程序都至少有一个函数,即主函数 main()
对于简单任务程序而言,全部的代码都写在main()函数中
对于实际开发,程序任务复杂多样
如果全写在main()函数中,就会变得庞大臃肿,结构复杂,造成有很多不必要的重复
由此根据程序的逻辑和任务的分工把代码写到不同的自定义函数中
而业务逻辑和处理流程化分到main()
需要执行具体任务再调用自定义函数
函数类型对比
库函数
C语言或系统提供(自带)
实现某些基本的功能,例如scanf、printf,可在程序中直接调用
需包含相对应头文件
自定义函数
程序员为了完成某项任务而编写的函数
实现某项功能或让主程序更简洁
使用自定义函数之前,必须先声明和定义
库函数
C语言提供了一些已声明和定义的函数
调用这些函数可以完成一些基本的功能
我们把这些函数称为C 标准函数(C standard library),简称库函数
例如printf、scanf、memset、strcpy等
栗子
strcpy(复制)
提个问题:为什么复制成了完全替换,而不是仅替换对应的空间长度的内容?
首先我们得明白在arr2“hello”的结尾后面是结束标志“\0”
他仅是结束标志不作为内容,但复制的同时也将它带上了
效果就是目标空间的“hello”后有个“\0”代表结束
后面的内容不会被读出,也就相当于“完全替换”
memset(内容指定)
注意:使用库函数必须包含相应的#include头文件
自定义函数
自定义函数和库函数都具有函数名称,返回值类型,函数参数
库函数无法干所有的事,需要程序员来发挥
调用
如果函数的返回值是void,表示函数以完成某项功能为主,一般用单行书写,独占一条语句
返回值不是void,单行书写则不关心它的返回值,也可以当成常量用于任何表达式中
参数的传递
函数的参数可以理解为函数的局部变量
传值
参数传递就是调用者程序把变量(或常量)的值复制一份给函数的参数
复制后调用者程序的变量和函数的参数就再也没有关系
所以在函数调用的过程中,函数的参数的值发生改变并不会影响调用者程序的变量的值
注:因为没有关系,形式参数与实际参数可重名
传址
任务有改变修改实际参数的必要,进行传址
告诉函数参数的空间地址,可直接对地址指向的对象进行有效改变
栗子
返回最大值函数
这个函数具有返回值:x>y成立的话,那么就返回x,否则就返回y。
接下来我们看看里一个形式的返回最大值
为什么不行呢?
注意函数内的x,y只是形势参数,它的改变不能影响到实际参数。
解决方案
这里我们是通过取地址,带入参数的地址,再解引用来改变参数内容
局别
其实用好传值和传址调用这个精髓,对函数的使用便会简单许多