一、函数声明、定义和类型
1、函数定义:
定义函数包含四部分:
返回值类型 函数名(形式参数列表){
函数体(实现函数功能代码)
}
2、函数四种类型
a、无返回值,无参数
void sayhi( ){
printf("Hello\n");
}
b、无返回值,有参数
void printSum(int n1, int n2){
printf("%d\n", n1+n2);
}
c、有返回值,有参数
int sumValue(int n1, int n2){
return n1+n2;
}
d、有返回值,无参数
int randomFrom20to40(){
return arc4random() % 21 + 20;
}
void表示无返回值类型。
3、函数体内return的作用:
a、return后面的数值类型必须和返回值类型相同;
b、return (数值);将数值返回到调用函数的地方,结束函数运行;
c、return语句之后的代码不执行;
d、如果函数没有返回值,可以没有return语句,如果有return语句,return后面不再写任何语句,并以分号结束。
4、函数声明
函数声明一般包括:返回值类型 函数名 参数列表 分号结束
函数声明位置:在头文件中,并在所有函数的定义和main函数的前面。
5、函数定义的位置
在函数声明之后,或在main函数之后。
二、函数调用
1、函数调用直接使用:函数名( )
2、如果没有参数:必须写( )
3、如果有参数:函数需要几个参数,必须传入几个参数,传入的值必须和提示的类型相同
4、如果函数有返回值,
a、只调用,不接收函数,如:sumValue(3, 6);
b、调用函数,返回值参与运算或作为其他函数的参数。
printf("sum = %d\n", sumValue(37, 28));
printf("random value = %d\n", randomFrom20to40());
c、调用函数,使用变量接收返回值。
int sum = sumValue(2, 3);
printf("sum = %d\n", sum);
5、函数调用过程:
a、使用函数名调用函数
b、进入到被调用函数的函数体内运行代码
c、函数运行结束后,返回调用函数的位置
6、主调函数,即调用函数的函数,如:main函数。
被调函数,即在主调函数中调用到的函数,如:sumValue( )。
三、函数的形式参数和实际参数
形式参数:出现在函数定义中,存储传入函数中的值
实际参数:出现在函数调用时,给函数提供要使用的值。
如:2和3是调用sumValue时的实参,是提供给函数的值
printf("sum = %d\n",sumValue(2, 3));
注意:调用函数的时候是实现实参向形参传值,实参向形参传值是拷贝的过程,实参的值并不会改变。
四、函数变量的分类和作用域
1、函数变量分为全局变量和局部变量
2、全局变量
位置:在函数外部定义。
作用域:从全局变量定义开始的位置,下面的代码中都可以使用。
全局变量和局部变量可以重名。
全局变量可以在工程的多个文件中使用。
3、局部变量
位置:在函数内定义的变量,只在当前函数内有效
作用域:在函数的{ }内有效,函数外部不能使用
不同的函数中可以定义同名的变量,相同的函数内不要使用同名的变量。
函数的形参,只在当前函数内有效。
在某个代码段内定义的变量,只能在找这个代码段内使用,如:分支、循环。
在代码段{ }内,使用代码段内部定义的变量;在代码段{ }外,使用代码段外部定义的变量。
五、使用数组作为函数参数
将数组传入函数,不是将数组中的所有元素一起传入函数,而是将数组的第一个元素的地址传入函数。所以,从函数外部向函数内部传入数组时,内部和外部操作的是同一个数组。
语法:
如果需要将一个一维数组传入函数,需要定义两个参数:
函数类型 函数名(类型 参数名[ ], 元素个数)
六、其他
1、函数嵌套
允许函数嵌套使用,但是不允许函数嵌套定义,即在定义的一个函数内部定义另一个函数。
2、函数递归:在函数定义的过程中,调用函数本身
分为:有终止的递归、无终止(不允许)的递归
有终止的递归:即当满足某个条件时,结束调用函数本身。