一、C语言
在程序中用到的所有函数,必须先定义,后使用。
函数不能嵌套定义,但函数间可以互相调用。
注:不能调用main函数,main函数是被操作系统调用的。
1.函数定义
函数可分为没有返回值函数和有返回值的函数。
(1)没有返回值函数
void 函数名(形式参数表列){
函数体;
return ;
}
(2)有返回值的函数
类型名 函数名(形式参数表列){
函数体;
return k;
}
注:
- 返回类型要与函数类型名一致,如果不同,会自动类型转换。
- 返回类型不能是数组,数组是二等公民。
2.函数原型
原型描述了函数到编译器的接口。将函数的返回值类型,参数类型和参数数量告诉编译器,可以降低程序出错的几率。
注: 函数原型不要求提供变量名,只要有类型列表就足够了。
3.函数调用
在调用函数过程中,系统会把实参的值传递给被调用函数的形参。该值在函数调用期间有效,可以参加被调函数中的运算。
在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在调用结束,形参单元被释放。实参单元仍保留并维持原值,没有改变。
二、C++
1.参数的默认值
有时需要用相同的实参反复调用同一函数,为了避免反复传递相同实参的信息, C++中允许函数定义默认的参数值。
如果一个函数中有多个参数,则设置参数默认值时,要求从右向左设置。当调用函数时,只能将实参从左向右为形参赋值,当实参数量少于形参数量时,形参从左向右与实参匹配,剩余形参则取默值。例如:
void dfs(int a,int b = 1, int c = 2);
注:当程序中既有函数的声明又有函数的定义时,默认参数只能在函数声明中给出,而定义中不允许设置默认参数。
2.函数重载
函数的重载是指建立多个同名的函数,但函数的形参表必须互不相同。不相同可以是形参个数不同,也可是形参的类型不同,还可两者都不同。(返回值不是,形参名也不是),重载函数也可以带有默认值参数,但是要注意二义性。(注意歧义,会报错)
注:函数重载一般在C++类中实现多态。
3.内联函数
以inline修饰的函数叫做内联函数。编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,一般类似C语言中的宏。
三、函数参数传递
1.传值调用(单值传递)
函数传值调用是将实参的值传递给形参,形参和实参各自具有单独的存储空间,因此改变形参的值时,实参的值不会受到任何影响。
2.传址调用
传址调用则传递的是变量的存储地址。实参是地址值,用地址常量或指针变量表示,形参是指针变量。
函数调用时系统将实参所表示的地址值赋给形参的指针变量,从而使得形参和实参的指针指向的是相同的存储地址。在被调用函数中,可以通过形参指针改变其所指向的元素。传址调用的实现机制就是可以通过改变形参所指向的变量值来影响实参。
3.引用调用
使用函数的引用调用时,函数的实参用变量名,形参是引用类型。函数调用时,实参给形参赋值,对引用进行了初始化,引用是实参的别名。在被调用函数中,可以通过引用间接访问被引用的变量,所有在引用上施加的操作,实质上就是施加在被引用变量上的操作。引用调用可以通过形参引用改变被调用函数中被引用的实参变量的值。