如果函数调用出现在函数定义之前,则对函数调用之前必须对其原型加以声明
函数的返回:
1、return(表达式); //有返回值
1、return表达式; //有返回值
1、return; //无返回值
8.2.1无参数无返回值的函数
格式:
void 函数名()
{
函数体;
}
声明格式:void 函数名()
调用格式:函数名();
8.2.1无参数有返回值的函数
格式:
返回值类型符 函数名()
{
函数体;
}
声明格式:返回值类型符 函数名();
调用格式:函数名(); 或 变量=函数名();
8.2.2带参数无返回值的函数
格式:
void 函数名(类型符1 形参名1,类型符2 形参名2,…类型符n,形参名n)
{
函数体
}
声明格式:
void 函数名(类型符 1 形参名1,类型符2 形参名2,…,类型符n,形参名n);
或
void 函数名(类型符 1 类型符2 … 类型符n);
调用格式:
void 函数名(实参列表);
8.3.3
带参数有返回值的函数
格式:
返回值类型符 函数名(类型符 1 形参名1,类型符2 形参名2,…,类型符n 形参名n);
{
函数体
}
声明格式:
返回值类型 函数名(类型符1 形参名1,类型符2 形参名2,…类型符n,形参名n)
或
返回值类型 函数名(类型符1,类型符2,…类型符n);
调用格式:
函数名(实参列表);
或
变量名=函数名(实参列表);
函数参数的传递方式
1、运用值传递方式
函数调用时,为形参分配内存单元,并将实参的值复制到形参中,调用结束,形参所占内存单元被释放,实参的内存单元任保留并维持原值。
2、运用地址传递方式
方式:函数调用时,将实参数据的存储地址作为参数传递给形参
特点:形参和实参占用同样的内存单元,函数中对形参值的改变也会改变实参的值。因此函数参数的地址传递方式可实现调用函数与被调函数之间的双向数据传递。
数组名作函数参数时所进行的传送只是地址的传送。
函数的递归调用(反复调用其自身)
当一个函数在它的函数体内直接或间接的调用它自身,就形成了函数递归。
递归调用有直接递归调用和间接递归调用。
编写递归函数有两个要点:
1.确定递归公式
2.确定结束递归调用的条件
函数的作用域
1、内部函数
如果在一个源文件中定义的函数只能被本文件的函数调用,而不能被同一源程序其他文件中的函数调用,这种函数称为内部函数。
static 类型说明符 函数名(形参表)
内部函数也称为静态函数,但此处静态的含义已不是指存储类型,而是指对函数的作用域只局限于本文件
2、外部函数
外部函数在整个源程序中都有效
extern 类型说明符 函数名(形参表);
在函数定义中如果没有说明extern或static,则隐含为extern。在一个源文件的函数中调用其它源文件中定义的外部函数时,应该用extern说明被调函数为外部函数。
(和全局变量调用的格式相同)