什么是函数的参数传递呢??它有几种呢?

Posted

tags:

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

函数的参数传递:当进行函数调用的时候,要填入与函数形式参数个数相同的实际参数,在程序运行的过程中,实参会将参数值传递给形参,这就是函数的参数传递。
函数参数传递有以下三种:

一. 值传递
1. 用值传递方式,实际上是把实参的内容复制到形参中,实参和形参是存放在两个不同的内存空间中。在函数体内对形参的一切修改对实参都没有影响;
2. 如果形参是类的对象,利用值传递的话每次都要调用类的构造函数构造对象,效率比较低。
二. 指针传递(地址传递)
1. 当进行指针传递的时候,形参是指针变量,实参是一个变量的地址或者是指针变量,调用函数的时候,形参指向实参的地址;
2. 指针传递中,函数体内可以通过形参指针改变实参地址空间的内容。
三. 传递引用
1.引用实际上是某一个变量的别名,和这个变量具有相同的内存空间;
2. 实参把变量传递给形参引用,相当于形参是实参变量的别名,对形参的修改都是直接修改实参;
3. 在类的成员函数中经常用到类的引用对象作为形参,大大的提高代码的效率。
参考技术A C++ 与VB一致吗?以下是VB的参数传递
在调用程序的过程中,实参和形参之间的传递方式有两种:按值传递(by val)和按址传递(by ref)
按值传递:
如果在调用过程中实参是常量或者表达式,或者在定义过程中明确有表明是按值传递,即在调用的过程中是将实际参数的值复制一份传递给形式参数,此后形式参数与实际参数之间就没有任何联系,在过程中对形式参数所做的任何改变不会影响实际参数。
按址传递:
如果在调用过程时,实参是变量,或者有明确表明是按址传递的。按址传递是实参和形参相结合的方式。在调用的过程中实际参数的地址传递给形式参数,即形参和实参都共同的用一地址的内存单位。因此在调用的过程时,任何对形参所做的改变都将影响实参。即实参会随着形参的改变而改变
参考技术B 函数的参数传递方式有三种:值传递、地址传递、引用传递。
一、 函数参数传递方式之一:值传递
1. 值传递的一个错误认识

先看题一中Exchg1函数的定义:
void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数

int tmp;
tmp=x;
x=y;
y=tmp;
printf(“x=%d,y=%d\n”,x,y)

利用这个函数来完成对a,b两个变量值的对调,程序如下:

void main()

int a=4,b=6;
Exchg1 (a,b) //a,b变量为Exchg1函数的实际参数。
/ printf(“a=%d,b=%d\n”,a,b)

程序输出的结果是:
x=6 , y=4
a=4 , b=6 //为什么不是a=6,b=4呢?
2. 一个预备的常识
为了说明这个问题,我先给出一个代码:
int a=4;
int x;
x=a;
x=x+3;
3. 理解值传递的形式
看调用Exch1函数的代码:
main()

int a=4,b=6;
Exchg1(a,b) //这里调用了Exchg1函数
printf(“a=%d,b=%d”,a,b)


Exchg1(a,b)时所完成的操作代码如下所示。
int x=a;//←
int y=b;//
int tmp;
tmp=x;
x=y;
y=tmp;
其实函数在调用时是隐含地把实参a,b 的值分别赋值给了x,y,之后在你写的Exchg1函数体内再也没有对a,b进行任何的操作了。交换的只是x,y变量。并不是a,b。当然a,b的值没有改变啦!函数只是把a,b的值通过赋值传递给了x,y,函数里头操作的只是x,y的值并不是a,b的值。这就是所谓的参数的值传递了。
二、函数参数传递方式之二:地址传递
看题二的代码:

Exchg2(int *px, int *py)

int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d\n”,*px,*py);

main()

int a=4;
int b=6;
Exchg2(&a,&b);
Print(“a=%d,b=%d\n”, a, b);

它的输出结果是:
*px=6,*py=4
a=6,b=4

看函数的接口部分:Exchg2(int *px,int *py),请注意:参数px,py都是指针。
再看调用处:Exchg2(&a, &b);
它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px,py。
px=&a;
py=&b;
整个Exchg2函数调用是如下执行的:
px=&a; //
py=&b; //请注意这两行,它是调用Exchg2的隐含动作。
int tmp=*px;
*px=*py;
*py=tmp;
print(“*px=%d,*py=%d\n”,*px,*py);
这样,有了头两行的隐含赋值操作。我们现在已经可以看出,指针px,py的值已经分别是a,b变量的地址值了。接下来,对*px,*py的操作当然也就是对a,b变量本身的操作了。所以函数里头的交换就是对a,b值的交换了,这就是所谓的地址传递。
三、函数参数传递方式之三:引用传递
看题三的代码:
Exchg3(int &x, int &y) //注意定义处的形式参数的格式与值传递不同

int tmp=x;
x=y;
y=tmp;
print(“x=%d,y=%d\n”,x,y);

main()

int a=4;
int b=6;
Exchg3(a,b); //注意:这里调用方式与值传递一样
Print(“a=%d,b=%d\n”, a, b);

输出结果:
x=6, y=4
a=6, b=4 //这个输出结果与值传递不同。
看到没有,与值传递相比,代码格式上只有一处是不同的,即在定义处:
Exchg3(int &x, int &y)。
但是我们发现a与b的值发生了对调。这说明了Exchg3(a,b)里头修改的是a,b变量,而不只是修改x,y了。
我们先看Exchg3函数的定义处Exchg3(int &x,int &y)。参数x,y是int的变量,调用时我们可以像值传递(如: Exchg1(a,b); )一样调用函数(如: Exchg3(a,b); )。但是x,y前都有一个取地址符号&。有了这个,调用Exchg3时函数会将a,b 分别代替了x,y了,我们称x,y分别引用了a,b变量。这样函数里头操作的其实就是实参a,b本身了,也就是说函数里是可以直接修改到a,b的值了。

LUA脚本怎么合函数传递参数

参考技术A static int ABC(lua_State *L)

int n =lua_gettop(L);
double sum =0;
int i;
for (i=1;i<n;i++)

sum+=lua_tonumber(L,i);

lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
return 2;
lua_register(L, "ABC", ABC);
参考技术B static int ABC(lua_State *L)

int n =lua_gettop(L);
double sum =0;
int i;
for (i=1;i<n;i++)

sum+=lua_tonumber(L,i);

lua_pushnumber(L,sum/n);
lua_pushnumber(L,sum);
return 2;
lua_register(L, "ABC", ABC);

以上是关于什么是函数的参数传递呢??它有几种呢?的主要内容,如果未能解决你的问题,请参考以下文章

在Jsp中页面与页面之间传递参数有几种方法?

c#中方法的参数可以有哪几种传递方式

JS函数如何传递带空格参数

C#在方法调用中,参数按值传递与按引用传递的区别是啥?

LUA脚本怎么合函数传递参数

Qt 槽函数怎么传递参数