6.2 函数的调用&声明&函数原型
一、函数调用的一般形式&调用方式
一般形式:函数名(实参表列)
函数调用方式
按照函数调用在程序中出现的
- 函数调用语句
- 函数调用作为一个语句,可以不返回参数;
printf_star();//printf_star为自定义的函数
- 函数表达式
- 函数调用时出现在另一个表达式中
c=max(a,b);//max为调用的函数
- 函数参数
- 函数调用作为另一个函数调用的实参
m=max(a,max(b,c));
二、函数调用时的数据传递
函数形参&实参
实际参数可以是常量、变量和表达式,但必须要有确定的值
实参和形参之间的数据传递
在函数调用时,形参会从实际参数那里拿到参与运算的实际的值。
在函数调用过程中发生的实参与形参之间的数据传递称之为“虚实结合”
函数调用结束后就继续返回主调函数往下走,而为该被调函数开辟的内存空间也就被释放了。
实参和形参的数据类型应该相互兼容,字符型、整型等可以相互转换
函数调用的过程
- 函数未调用前,形参是不占内存空间的,只有在被调用时,则会被临时分配一块内存空间。
- 将实参的值传递给形参,形参得到实参的值后参与运算。
- 利用return 将函数运算的结果返回主调函数,如果不需要返回值,则定义函数类型为 void 也就不用写 return 了
- 调用结束后,形参单元被释放,函数语句返回主函数继续运行,这时候,实参单元的值还是原来的值,并没有改变
实参向形参的数据传递是“值传递”的过程,单向传递,只能由实参传递给形参,而不能由形参传递给实参,实参和形参在内存中占有不同的内存存储单元,实参无法得到形参的值。
函数的返回值
- 需要从被调函数中得到一个值到主调函数中,需要用 return 语句
- 一个函数中可以有多个return,不过只有第一个被执行到的return 起作用,直接从被调函数带一个值到主调函数中,被调函数就结束了,return 这句后边不管有没有语句都结束了。
- 定义时应指定函数返回值的类型,要类型一致。如果return 后边返回的值与函数类型不一致,要以函数名前的数据类型一致。即 函数类型决定返回值类型。
- 不带函数返回值的函数,定义成 void 类型,函数体里边也不要写return。
三、对被调函数的声明和函数原型
如果一个自定义函数被调用的位置在定义的位置前,则需要提前对这个函数进行声明,格式与定义相同,可以不用写形参名,只写形参类型即可。
为什么要提前声明???
因为程序编译是自上而下的,你自己定义的函数系统是识别不了的,必须提前告诉系统这是我自定义的函数,否则他以为你自己胡乱写的垃圾代码,就会报错。函数声明就是起一个告知系统的作用。
自定义函数的首行也叫函数首部,称为函数原型
int max (int,int); //函数声明
int max (int a,int b) //函数首部 也称之为函数原型
{
函数体
}
外部声明:写在所有函数前面的声明叫外部声明,对整个文件范围都有效,不用在被调函数前再进行声明。