【整理】--C++三种参数传递方式

在C++中,共有三种参数传递方式:

  • 按值传递(pass by value)
  • 地址传递(pass by pointer)
  • 引用传递(pass by reference)

(1)按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。

使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。

例子:

/*
pass By value
*/
#include <iostream>
using namespace std;
void swap(int,int);
int main()
{
int a = 3, b = 4;
cout << "a = " << a << ", b = "
<< b << endl;
swap(a,b);
cout << "a = " << a << ", b = "
<< b << endl;
return 0;
}
void swap(int x, int y)
{
int t = x;
x = y;
y = t;
}

输出:

a=3,b=4

a=3,b=4

(2)如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。

地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

#include <iostream>
using namespace std;
void swap(int*,int*);
int main()
{
int a = 3, b = 4;
cout << "a = " << a << ", b = "
<< b << endl;
swap(&a,&b);
cout << "a = " << a << ", b = "
<< b << endl;
system("pause");
return 0;
}
void swap(int *x,int *y)
{
int t = *x;
*x = *y;
*y = t;
}

输出:

a=3,b=4

a=4,b=3

分析:

mian()中传递的参数是地址

swap(int * x , int * y)中x,y 为int 类型的指针变量。*x,*y 将地址对应的存储的东西交换,相当于x的地址存原来y的值,y的地址存原来x的值

个人理解:&x  整体上相当于一个指针   对应着内存地址

     

(3)如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”

#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
int a = 3, b = 4;
cout << "a = " << a << ", b = "
<< b << endl;
swap(a,b);
cout << "a = " << a << ", b = "
<< b << endl;
system("pause");
return 0;
}
void swap(int &rx,int &ry)
{
int t = rx;
rx = ry;
ry = t;
}

输出:

a=3,b=4

a=4,b=3

分析:

swap 中的rx ry 相当于是 main中 x y 的别名,虽然变量名不同,但却对应同一个内存中的变量

不同的名字,同一个变量

时间: 2024-10-26 13:50:26

【整理】--C++三种参数传递方式的相关文章

固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

一.Convert类常用的类型转换方法Convert.ToInt32() 转换为整型(int)Convert.ToChar() 转换为字符型(char)Convert.ToString() 转换为字符串型(string)Convert.ToDateTime() 转换为日期型(datetime)Convert.ToDouble() 转换为双精度浮点型(double)Conert.ToSingle() 转换为单精度浮点型(float) 二.运算符算术运算符 + - * / %逻辑运算符 & | ^

PLSQL中的三种参数模式IN、OUT、IN OUT

1.IN模式 IN模式是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变. 错误例子: 1 create or replace procedure in_proc ( 2 p_a in number , -- 形参, 这里的值是调用处传递的实参 3 p_b in number 4 )as 5 begin 6 p_a := 10 ; --实参被传递进来以后,在这个程序体中值就不可能被改变了 7 p_b := 20 ; 8 DBMS_OUTPUT.PUT_LINE(p_a

产品经理学Python:参数传递方式

这是关于Python的第5篇文章,主要介绍下参数传递方式和如何设计自己的函数. (一) 本篇主要介绍2种参数传递方式. 位置参数 调用函数时,根据函数定义的参数位置来传递参数. 1 def right_triangle_area(a,b): 2 return 1/2*a*b 3 4 print(right_triangle_area(3,4)) 5 # 位置参数传递 求直角三角形面积,a.b分别为两条直角边,这里调用函数时使用的是位置参数传递.在位置参数传递中,参数的顺序是不可改变的. 关键词参

三种方法教你如何用PHP模拟post提交数据

php模拟post传值在日常的工作中用到的不是很多,但是在某些特定的场合还是经常用到的. 下面,我整理了三种php模拟post传值的方法,file_get_contents.curl和socket. ? 第一种:file_get_contents来模拟post ? <?php ? function file_get_contents_post($url, $post){ ? $options = array( 'http'=> array( 'method'=>'POST', 'cont

有关.NET参数传递方式的思考

年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做的事,吃我想吃的东西.).本人由上个月的每周四五篇,到现在的文章缩短到每周一篇,说个实话,现在的一篇也有不想写的心思了(这一篇还是咬着牙写的,感觉实在是写不动了,写博客太折腾人了,谁写谁知道啊!),不过还是希望写出来可以帮到大家,如有写的不足的地方,还望大家多多指正,知识在于总结和反思,对别人也对自

关于.NET参数传递方式的思考

年关将近,整个人已经没有了工作和写作的激情,估计这个时候很多人跟我差不多,该相亲的相亲,该聚会喝酒的聚会喝酒,总之就是没有了干活的心思(我有很多想法,但就是叫不动我的手脚,所以我只能看着别人在做我想做的事,吃我想吃的东西.).本人由上个月的每周四五篇,到现在的文章缩短到每周一篇,说个实话,现在的一篇也有不想写的心思了(这一篇还是咬着牙写的,感觉实在是写不动了,写博客太折腾人了,谁写谁知道啊!),不过还是希望写出来可以帮到大家,如有写的不足的地方,还望大家多多指正,知识在于总结和反思,对别人也对自

三种UIScrollView嵌套实现方案

背景 随着产品功能不断的迭代,总会有需求希望在保证不影响其他区域功能的前提下,在某一区域实现根据选择器切换不同的内容显示. 苹果并不推荐嵌套滚动视图,如果直接添加的话,就会出现下图这种情况,手势的冲突造成了体验上的悲剧. 在实际开发中,我也不断的在思考解决方案,经历了几次重构后,有了些改进的经验,因此抽空整理了三种方案,他们实现的最终效果都是一样的. 分而治之 最常见的一种方案就是使用 UITableView 作为外部框架,将子视图的内容通过 UITableViewCell 的方式展现. 这种做

Liunx 环境下vsftpd的三种实现方法(超详细参数)

以下文章介绍Liunx 环境下vsftpd的三种实现方法 ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz,目前已经到2.0.3版本.假设我们已经将vsftpd-2.0.3.tar.gz文件下载到服务器的/home/xuchen目录 代码: # cd /home/xuchen # tar xzvf vsftpd-2.0.3.tar.gz //解压缩程序 # cd vsftpd-2.0.3 三.三种方式的实现            

【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)

一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测试配置]) Mysql源码包 (必须选择与你已安装mysql的版本一致) 为了避免安装中出现依赖包缺失,你需要打一句鸡血: yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel exp