函数参数的传递方式

1.将变量名作为形参和实参

在这种情况下传给形参的是变量的值。传递是单向的,即如果在执行函数期间形参的值发生变化,并不传回给实参,这就是值传递方式。因为在调用函数期间,形参和实参不是同一个存储单元。

int main(){

void swap(int,int);//参数为整型变量

int i=3,j=4;

cout<<"i="<<i<<",j="<<j<<endl;

swap(i,j);//变量名

cout<<"i="<<i<<",j="<<j<<endl;

system("PAUSE");

return 0;

}

void swap(int a,int b){//形参为整型变量

int temp;

temp=a;

a=b;

b=temp;

}

结果:

i=3,j=4

i=3,j=4

可以发现,执行函数swap后,形参a和b的改变不会影响实参i和j的值。

2.传递变量指针

形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。

int main(){

void swap(int*,int*);//参数为整型指针变量

int i=3,j=4;

cout<<"i="<<i<<",j="<<j<<endl;

swap(&i,&j);//变量地址

cout<<"i="<<i<<",j="<<j<<endl;

system("PAUSE");

return 0;

}

void swap(int *p1,int *p2){//形参为整型指针变量

int temp;

temp=*p1;

*p1=*p2;

*p2=temp;

}

结果:

i=3,j=4

i=4,j=3

调用函数时把变量i和j的地址传送给形参p1和p2,因此*p1和i为同一内存单元,*p2和j是同一内存单元。

这种方式还是“值传递”,只不过实参的值是变量的地址而已。而在函数中改变的不是实参的值(即地址,这种改变也影响不到实参),而是实参地址所指向的变量的值。

3.“引用形参”

int main(){

void swap(int&,int&);//参数为整型变量的引用

int i=3,j=4;

cout<<"i="<<i<<",j="<<j<<endl;

swap(i,j);//变量名

cout<<"i="<<i<<",j="<<j<<endl;

system("PAUSE");

return 0;

}

void swap(int &a,int &b){//形参为引用类型

int temp;

temp=a;

a=b;

b=temp;

}

结果:

i=3,j=4

i=4,j=3

当main函数调用swap函数时,由实参把变量名传给形参。i的名字传给引用变量a,j的名字传给引用变量b。此时a和b就分别与i,j占用同一内存空间。这种把实参地址传递到形参,使形参的地址取实参的地址,从而使形参与实参共享同一单元的方式,就是地址传递方式。

这里要说明的是,

[1]方式2传递指针变量要另外开辟内存单元,其内容为地址;而方式3引用不是一个独立的变量,不单独占内存单元。

[2]方式3中,main函数调用swap函数时,实参不必用函数的地址(即&i,&j),而直接使用变量名。系统向形参传递的是实参的地址而不是实参的值。

时间: 2024-12-28 01:39:53

函数参数的传递方式的相关文章

Java函数参数传递方式详解

在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value Java代码   public static class Value { private String value = "value"; public String getValue() { return value; } pub

C语言函数的参数及传递方式

1.形式参数和实际参数 1.1形式参数 形参出现在被调函数当中,在整个函数体内都可以使用.形参在定义时编译系统并不分配存储空间,只有在调用该函数时才分配内存单元.调用结束内存单元被释放,故形参只有在函数调用时有效,调用结束时不能再使用. 1.2实际参数 实参出现在主调函数当中,当函数调用时,朱调函数把实参的值传送给被调函数的形参,从而实现函数间的数据传递.传递方式有两种:值传递和地址传递方式. 2.变量作为函数参数 当形参定义为变量时,实参可以是常量.变量和表达式,这种函数间的参数传递为值传递方

函数参数传递方式详解

1. 函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看如下的一个问题: 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); } 问:你认为这个函数是在做什么呀? 答:好像是对参数x.y的值对调吧? 请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下: mai

C++函数参数-值,指针,引用

本文转载自SurpassLi的博文:http://www.cnblogs.com/lidabo/archive/2012/05/30/2525837.html,修改了部分代码和贴图,如有侵犯版权请与我联系删除.           以“ 值传递”方式向函数传递参数 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: void changeValue(int or

C# - 函数参数的传递

近段时间,有几个刚刚开始学习C#语言的爱好者问我:C#中的函数,其参数的传递,按值传递和按引用传递有什么区别.针对这一问题,我简单写了个示例程序,用以讲解,希望我没有把他们绕晕.因为,常听别人说起:“你不说我还明白,你一说,我就糊涂了”.     好,现在开始吧.     我们知道,在C#中,类型有值类型(例如int)和引用类型(例如string)之分,传递参数有按值传递和按引用传递之分.这样,简单的组合一下,我们可以得到以下几种传递方式:(1)按值传递值类型.(2)按值传递引用类型.(3)按引

数组和指针作为函数参数——高质量C、C++编程指南

本文内容出自<高质量C.C++编程指南>.阅读之后理解,然后通过自己的话和例子讲清楚,这样才是学习之道.以下内容都是自己所认为的东西,如果哪里错了,希望各位大神指出. 1.数组作为函数的参数进行传递时,该数组自动退化为同类型的指针 结果: 第一张图中,str为数组,此时的长度为6,而作为函数参数时退化为指针了,指针的长度固定为4. 第一张图中,str为数组,所以不能对str进行自增或自减,而在函数中是可以的,因为退化为指针了,而指针时可以进行自增自减的. 2.指针参数是如何传递内存的 传递方式

c++函数参数类型-值,指针,引用

    以" 值传递"方式向函数传递参数 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: void changeValue(int originalValue,int newValue){     originalValue = newValue;   }      int main(){     int myNum=20;     changeV

JavaScript中函数参数的值传递和引用传递

结论:对于数字.字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量. 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组)的地址.当函数改变这个地址指向的对象(数组)的内容时,同时也改变了函数外部变量指向的对象(数组)的内容:当函数改变的是变量的地址时,实际就与函数外部的变量失去了联系,变成了完全不同的对象了,不会对函数外部对象造成改变. 很多人认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.

python 函数参数多种传递方法

python进阶教程之函数参数的多种传递方法 我们已经接触过函数(function)的参数(arguments)传递.当时我们根据位置,传递对应的参数.我们将接触更多的参数传递方式.回忆一下位置传递:复制代码代码如下: def f(a,b,c): return a+b+cprint(f(1,2,3)) 在调用f时,1,2,3根据位置分别传递给了a,b,c.关键字传递有些情况下,用位置传递会感觉比较死板.关键字(keyword)传递是根据每个参数的名字传递参数.关键字并不用遵守位置的对应关系.依然