函数的参数传递

Posted plague0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的参数传递相关的知识,希望对你有一定的参考价值。

 

一、    形参与实参

  1.  形式参数(简称形参):定义函数时,函数名后面括号中的变量名。由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。

 

    eg:当你定义函数void add(int a, int b)的时候,这里的a和b就是形参。(注意:函数定义不能在主函数中。)

 

  2.  实际参数(简称实参):调用函数时,函数名后面括号中的表达式。是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

 

    eg:当你调用函数add(1 ,2)的时候,这里的1和2就是实参。      

 

注:

1.      实参必须有确定的值;

2.      形参必须指定类型;

3.      形参和实参类型一致,个数相同;

4.      若形参与实参类型不一致,自动按形参类型转换;eg:一个形参需要double类型数据,实参给了int类型数据,int会自动转化成double。如果实参没法转化成实参类型,则会报错;

5.      形参在函数被调用前不占内存,在函数被调用时才分配形参的存储单元,调用结束后,内存释放。

 

1:若有下面的函数调用:fun(a+b,3,max(n-1,b)),则fun的实参个数是(   )

 

A.3               B . 4               C . 5             D . 6

 

答案:A

 

解析:C++中函数调用的一般形式为:函数名(实参表),其中实参表是用逗号分隔的一系列表达式。fun()函数的实参表由实参a+b、3和max(n-1,b)组成,实参个数为3个。

简单来说,实参以逗号隔开,上题有两个逗号,所以有三个实参。

 

 

 二、    参数传递方式

 

 

有两种:值传递和引用传递。

 

  1.      值传递:单向传递,形参只是得到实参的值,它和实参是两个不同的对象,不会互相影响,改变形参,不影响实参。

 

    例:

 1 #include<iostream>
 2 using namespace std;
 3 void Swap(int, int);
 4 
 5 int main()
 6 {
 7     int a = 1, b = 2;
 8     cout << "a的值为:" << a << "b的值为:" <<b<<endl;
 9     Swap(a, b);
10     cout << "a的值为:" << a << "b的值为:" <<b<<endl;
11 }
12 
13 void Swap(int x, int y)
14 {
15     int temp;
16     temp = x;
17     x = y;
18     y = temp;
19     cout << "Swap函数中a的值为:" << x << "Swap函数中b的值为:" << y << endl;
20 }

运行结果:

    技术图片

 

    从上面可以看出,主函数声明了两个全局变量a,b并对其赋值1,2;通过函数Swp()函数调用之后,在函数内部将a和b的值交换了,使得函数内,a=2,b=1;但是,这个过程并没有改变全局变量a和b的值。

 

    分析:

      函数Swap()被调用前,实参a和b有自己的存储空间,并且有自己的初始值。当调用函数Swap()时,为形参(即函数的参数)x和y分配存储空间,并将a和b的值复制过来,函数执行过程中,将x和y的值进行交换,当函数执行结束之后,x和y所占用的存储空间将被释放,这种传递的方式,并不会对实参a和b的值产生影响,此即为值传递。

 

 2:在下列原型所示的C++函数中,按“传值”方式传递参数的是(   )

A.     Void f1(int x);    B.void f2(int *x);   C.void f3(const int *x);   D.void f4(int &x);

 

答案:A

 

解析:函数参数的3种传递方式:①将变量名作为形参和实参,即传值方式;②传递变量指针;③引用形参。其中B、C选项都是传递变量指针,D选项为引用形参,所以本题答案为A。

 

 

  2.      引用传递:双向传递,形参是实参的引用。也就是可以认为形参和实参是同一个对象,你在函数中对形参的修改也会影响外部的实参。(常引用作参数可以保障实参数据的安全性。)

 

    例:

    

 1 #include<iostream>
 2 using namespace std;
 3 void Swap(int&, int&);
 4 
 5 int main()
 6 {
 7     int a = 1, b = 2;
 8     cout << "a的值为:" << a << "b的值为:" <<b<<endl;
 9     Swap(a, b);
10     cout << "a的值为:" << a << "b的值为:" <<b<<endl;
11 }
12 
13 void Swap(int &x, int &y)
14 {
15     int temp;
16     temp = x;
17     x = y;
18     y = temp;
19     cout << "Swap函数中a的值为:" << x << "Swap函数中b的值为:" << y << endl;
20 }

运行结果:

    技术图片

 

    当函数未调用之前,实参a和b的值分别为1和2。当函数调用过程中,形参的值被交换,即a=2,b=1;函数调用结束之后,实参的值被改变。即函数调用时,作为形参的引用变量并不分配新的内存空间,它将作为实参变量的别名与其共用内存。

 

    说明:

      使用引用参数可以直接操作实参变量,从而能够实现通过修改形参的值而达到修改对应实参值得目的。当引用作为函数形参,其引用的目标变量没人为调用该函数时对应的实参变量名,所以,在定义函数时,对于引用类型参数不必提供引用的初始值。

 

 

 

以上是关于函数的参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针

是否可以在 XML 中传递构造函数参数?

如何绕过将数据模型传递给片段参数以避免事务太大异常?

JS常用代码片段-127个常用罗列-值得收藏

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

在C代码中将结构体变量作为参数传递效率忒低