函数
定义:是一段满足一定形式且具有特定功能的代码
语法形式:
返回值类型 函数名(参数列表){
//函数体
}
函数的意义
(1) 函数可以重复调用 函数的代码不需要重复实现
(2) 提升开发效率
(3) 有利于结构化编程 实现项目的基础
(4) 对于别人提供的函数 不需要知道实现原理和过程 只需要知道调用即可
自定义函数:
返回值类型 函数名(形参列表){
//函数体
}
返回值类型:
调用一个函数往往是求一个数据,这个数据一定有类型,那么这个数据的类型将被定义为函数的返回值类型
有些函数没有返回一个结果(数据),那么该函数将可以定义为void
函数名: 标识符 不能同名
形参列表: 用来接收调用函数时所给的数据
像定义变量一样
注意:
(1)一个形参一个类型,如果多个形参的类型即使一致,也不能省略类型
(2)形参之间用逗号隔开
(3)一个函数可以没有任何形参,也可以有任意多的形参
(4)当形参列表为空时,代表该函数可以接收任意多的参数
(5)当函数如果明确不接收任意参数时,可以指定为void
int x,y;
void fun(int x,int y) 不能写成 void fun(int x,y)//错误的
void:
(1) 函数没有返回值
(2) 声明函数形参 表示函数不能接收任何参数
函数体:
实现函数功能的代码
如果该函数的返回值类型不是void,则一般通过return来返回特定的结果
return:
return val; //表示把该结果返回给函数的调用者
如果函数声明为void,那么这个时候也可以用 return;
作用:
(1)返回一个结果
(2)结束一个函数
调用函数:
变量 = 函数名(实参列表);//调用函数
变量将会保存函数返回的结果
自定义函数的位置:
一般在main函数的上面的声明定义
C函数的隐式声明:
(1)C语言中的函数默认返回值类型为int
如果一个函数的返回值类型为int,则可以省略
int func(){}
func(){}
(2)C语言中调用函数,如果在编译时,前面并没有声明过该函数
则编译器会隐式声明一个函数
这个函数的返回值类型默认为int类型
如果当后面如果自己声明的函数返回值类型不是int时编译报警告
如果是让写一个函数求什么结果,这个结果并不需要在函数中printf(),把该结果返回即可
函数参数的传递过程:
(1)实参和形参可以同名 也可以不同名 但是对应位置的类型得一致
一致并不代表完全一模一样 一致可以是隐式类型转换
所以如果类型不一致,编译时将报错
(2)形参在函数调用时被初始化了,是用实参的值初始化
(3)实参和形参是不同的两个变量 它们只是在调用初始化值 一样而已
(4)C语言中函数传递的过程是值传递的过程 即复制
(5)对于普通数据类型 在函数中修改形参的值 并不会影响实参的值
注意:对于数组而言,在函数中修改数组中的元素 会影响原来实参数组的值
[注:以后讲指针时再解释]
(6)关于定义函数时不让函数修改形参的值
形参类型前加 const 表示在该函数中不能对形参的值进行修改
一般情况下 修改 数组 才有意义
func(const int arr[],size_t len) 数组中的元素在该函数中不能被修改
形参加const,防止在函数中意外地修改
增加代码的健壮性 和 可读性
const修饰的变量,表示 只读 不可以修改
递归函数
(1) 退出条件
(2) 满足一定递归规则
函数调用:
在内存中开辟一块内存区域用于保存函数的开支
函数调用过程中这片内存不会回收
函数调用之后会回收该内存
函数调用需要耗时(这个时间很少)
递归深度如果太深,会导致性能损耗过快
内存消耗大,性能变低