1.函数定义
(1)定义无参函数
类型名 函数名()
{
函数体
}
或
类型名 函数名(void)
{
函数体
}
(2)定义有参函数
类型名 函数名(形式参数列表)
{
函数体
}
(3)定义空函数
类型名 函数名()
{
}
2.函数的调用
(1)函数调用形式
printf_star(); //调用无参函数
c=max(a,b); //调用有参函数
m=max(a,max(b,c)); //函数参数
(2)形参与实参
形参:在定义函数时,函数名括号内的变量名称为"形式参数"。
参数必须要指定类型
实参:在调用函数时,传递进去的值被称为实参,实参可以是 变量、常量或者表达式。
实参必须是确定的值
数据传递
传值不改变内存之间传递、不改变元内存
传地址:把变量地址传递,改变原内存
3.函数调用过程
(1)在定义函数中指定形参,在未出现函数调用,不占内存中存储单元,在发生调用时,函数的形参被分配内存单元
(2)将实参传个形参对应的值
(3)在执行max函数期间,由于有值,可以进行有关运算
(4)通过return语句将函数值带回主调函数,如果无返回值,则不需要return
(5)调用结束,形参单元被释放,实参仍保留,形参改变不影响实参的值
4.函数的返回值
(1)函数返回值是通过函数中的return语句获得的
(2)函数值的类型,在定义函数时就要指定
(3)在定义函数时指定的函数类型一般应该和return语句的表达式类型一致
(4)对于不带返回值的函数,应当用定义函数为“void类型”(或称“空类型”)
5.对被调用函数的声明与函数原型
在一个函数中调用另一个函数(即被调用函数)需要如下条件
(1)首先被调用函数必须是已经定义好的函数
(2)如果使用库函数,在开头使用#include指令
(3)如果使用用户自己定义的函数,而该函数位置在主函数的后面,应在主调函数对被调函数作声明
声明作用:把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法
#include<stdio.h>
int main(){
void add();
add();
return 0;
}
add()
{
printf("hello");
}
6.函数声明方式有两种
(1)函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,······ ,参数类型n 参数名n)
(2)函数类型 函数名(参数类型1,参数类型2,······,参数类型n)
7.函数的嵌套调用
C语言函数是相互平行、独立的,也就是说一个函数内不能再定义另一个函数,不能嵌套定义,但可以嵌套调用函数,也就是说再调用一个函数过程中可以调用另一个函数
函数递归:在调用一个函数的过程中又直接间接地调用该函数本身,被称为函数的递归
8.数组作为参数传递
(1)数组元素可以作为函数实参,不能用于形参,因为形参是在函数调用时临时分配存储单元,不可能为一个数组元素单独分配存储单元,把数组元素做实参传递实际时值传递,是从实参到形参,单向传递。
max(2,a[i]);
(2)数组名作为函数参数,用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名做函数实参时,向形参(数组名或指针变量)传递的时数组首个元素的地址
int main(){
average(float array[10]);
float sore[10];
average(score);
return 0;
}
average(float array[10]){
}
array作为形参可以不指定大小,只是将实参的首个地址传进形参
多维函数传参
int main(){
average(float array[2][10]);
float sore[2][10];
average(score);
return 0;
}
average(float array[2][10]){
}
9.局部变量与全局变量
(1)局部变量定义三种情况
在函数开头
在函数复合语句内定义
在函数的外部定义
(2)全局变量
在函数之外定义的变量称为外部变量,外部变量被称为全局变量(也称为全程变量)
10.变量的存储方式和生存期
(1)变量的存储方式
动态存储和静态存储
存储空间分为(1)程序区(2)静态存储区(3)动态存储区
数据分别存在静态存储区和动态存储区。
全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
在动态存储区存放一下数据
(1)函数形式参数
(2)函数中定义的没用关键字static声明的变量
(3)函数调用时的现场保护和返回地址等
调用开始分配存储空间,结束释放空间