定义:
形参(形式参数)
在函数定义中出现的参数,可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称形参。
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为实际参数,简称实参。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
形参和实参的区别与联系:
- 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
- 实参和形参在数量上、类型上、顺序上必须严格一致,否则会发生“类型不匹配”的错误。当然,如果能够进行自动类型转换,或者进行了强制类型转换,那么实参类型也可以不同于形参类型。
- 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
形参前面加&:
在一些函数中,形参的前面有一个&,是什么意思呢?
注意:C语言不能在函数参数前加&,能加&的是C++语言。
在C++语言里,类型后加&表示引用,如:
int a;
int & b = a;
表示b引用a,b实际上就是a的别名。修改b的值也会导致a的值被修改。
函数传参时,加&表示把实参直接传递给函数,而不加&表示是传拷贝。
传引用:将实参直接传给形参,对于复杂点的较大的结构体或类类型,可以省去效率低的拷贝过程,但如果传的是非const引用,那么在函数内部对形参的修改将会导致实参也会被修改。
传值:将实参拷贝一份传给形参,因此对于传递大点的数据结构时效率相对较低,对形参的修改不会影响外部实参。
C语言中没有引用的概念,都是以指针处理。
举例:
初始化栈的操作:
c++方式:
void InitStack(SqStack & S){
S.top=-1;
}
int main(){
SqStack S;
InitStack(S);
}
C语言方式:
void InitStack(SqStack * S){
S->top=-1;
}
int main(){
SqStack S;
InitStack(&S);
}