转自:http://myturn.blog.hexun.com/15584978_d.html

#include <iostream>

using namespace std ;

void Swap(int x, int y) ;

int main(void)

{

int a = 1 ;

int b = 2 ;

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 temp = x ;

x = y ;

y = temp ;

}

输出结果:

a = 1, b = 2

a = 1, b = 2

原因:Swap(int x, int y)函数采用值传递的方式,传入的实参实际上是a和b的副本而非其本身,所以对副本的改变并不会反应到a和b本身上。这个例子很简单,但是大一最开始学的时候,压根就不理解,因为那时候对内存的原理和结构不熟悉!!!

二:引用传递

void Swap(int &x, int &y)

{

int temp = x ;

x = y ;

y = temp ;

}

输出结果:

a = 1, b = 2

a = 2, b = 1

原因:Swap(int x, int y)函数采用引用传递的方式,传入的实参实际上是a和b的引用,对引用的改变会直接反应到a和b本身上。引用是C++引进的语法,是一个很有用的工具吧,实质上就是包装了指针,简化程序猿的负担,理解了指针才能理解引用,我们当然不能只停留在死记硬背上面,当然是要自己画出数据在内存中的存储方式。

三:指针传递

1.  改变指针本身

void Swap(int *x, int *y)

{

int *temp = x ;

x = y ;

y = temp ;

}

调用方法:Swap(&a, &b) ;

输出结果:

a = 1, b = 2

a = 1, b = 2  //这里是不是让你大吃一惊,反正我当时是惊呆了,这个当时还就是今年的4月时候,不过当时真没有写过这样的指针形式,也没有遇到这样的情形,这个例子对加深函数的参数传递是很有帮助的,也就是说函数传递参数都是传递的实参的副本,即使是传递的指针副本,这个例子里面我们没有对这个副本指针进行解除引用操作(*)也即间接引用,所以我们是访问不到实参变量的,这里进行的赋值也只是对指针副本进行的赋值.  当时真的没有想这么多哎,只是傻傻的以为指针很好用,能够操作内存,好酷炫,还以为是很神秘的技术,原来也是传递的一个副本.只是C语言提供了对它操作内存的能力。用*操作就可以直接访问实参变量...要用心(*)啊!!!不得不赞C语言.

原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参实际上是a和b的指针的副本,而且改变的是副本本身而非其间接引用,所以不会影响的指针所指向的值,即a和b本身上。

2.  改变指针的间接引用

void Swap(int *x, int *y)

{

int temp = *x ;

*x = *y ;

*y = temp ;

}

调用方法:Swap(&a, &b) ;

输出结果:

a = 1, b = 2

a = 2, b = 1

原因:Swap(int x, int y)函数采用指针传递的方式,传入的实参虽然也是a和b的指针的副本,但是改变的是副本的间接引用,无论是指针本身还是其副本,都指向相同的值,所以这个改变会反应到a和b本身

总之,如果想在被调用函数中改变哪个变量的值就需要把那个变量的地址传给被调用函数,这样在被调用函数中通过地址就可以访问和修改这个变量。传值的时候会对参数进行拷贝,然后传给被调用函数,而传地址只是对地址进行一份拷贝,然后赋给形参,这样在C++中如果传递一个比较大的对象时效率就有所区别了。对于简单类型的变量来说传值和传地址在根本上是没有区别的,都是传递一个数给被调用函数,地址本身就是一个变量,地址变量大小与地址总线有关,常用的是32位地址总线,也就是说地址变量大小为4Bytes(32bit),而怎样去解释和使用这个数是我们事先约定好的。约定好的呀!! 计算机就为我们所用噜,想去哪就去哪...致指针...

转载于:https://www.cnblogs.com/QingCHOW/p/4588483.html

传值调用 与传地址调用(传引用)相关推荐

  1. C++中的参数传递方式:传值、传地址、传引用总结

    指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元. 引用:引用和原变量是同一个东西,只不过是原变量的一个别名. int a = 10; 定义一个整型变量aint *p = ...

  2. 传值、传地址、传名的区别

    传值.传地址.传名的区别 例题: (1)引用调用(call-by-reference) 传入的是B[1]的地址,也就是说x的改变会影响B[1]. I=1; x=x+2;//x为B[1],B[1]为3. ...

  3. 值传递 引用传递(传地址,传引用)的区别

    传值      是把实参的值赋值给行参      那么对行参的修改,不会影响实参的值           传地址      是传值的一种特殊方式,只是他传递的是地址,不是普通的如int      那么 ...

  4. c语言 函数调用 传值调用 引用调用 传地址调用,C语言中的传值调用和引用调用...

    在使用一个音频芯片时,需要用到这样一个功能,即对音量进行调节.在厂家提供的驱动里面没有这样的功能函数,因此需要自行添加.注意到厂家提供的驱动里面包含了一个写入命令的函数,void Vol_Cmd(ui ...

  5. Java的形参、实参与传值调用、传地址调用

    形参:方法声明时小括号内声明的变量,如下面的 int i: void fun(int i){i=i+1; } 是为了声明此方法需要传入的参数类型.在方法被调用时创建,在方法结束时销毁,只作用于方法内部 ...

  6. C/C++中传值和传地址(引用)

    C/C++中参数传递有两种方式,传值或传地址(传引用),通常我们要在被调用函数中改变一个变量的值就需要传地址调用方式,例如: void swap_by_value(int a, int b) {int ...

  7. 简单区别形参与实参,传值与传地址

    简单区别形参与实参,传值.传地址与传引用 函数的参数分为两种,分别是实际参数(实参)和形式参数(形参) 实际参数: 真实传给函数的参数,叫实参.实参可以是:常量.变量.表达式.函数等.无论实参是何种类 ...

  8. file上传代码 ios_文件上传_iOS上传SDK_客户端上传_上传SDK_视频点播 - 阿里云

    上传地址和凭证方式 上传地址和凭证方式调用init方法初始化. 请求获取的上传地址和凭证初始化时无需设置,在开始上传开始后触发的OnUploadStartedListener回调中调用setUploa ...

  9. 【 C 】函数参数通过传值调用还是传址调用?

    C 函数的所有参数均以 "传值调用" 方式进行传递,这意味着函数将获得参数值的一份拷贝.这样函数就可以放心修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数. 既然调用函数 ...

最新文章

  1. python工程~多个python文件如何运行
  2. php打印错误日志到本地,nginx+php怎么打印php的错误日志?
  3. K - Repeating Decimals(循环小数)
  4. 解决 No utmpx entry. You must exec login from the lowest level shell.
  5. 51nod1001数组中和等于K的数对
  6. WIFI pineapple使用心得
  7. 汇编 DOS系统功能调用
  8. 初识emqx消息服务器
  9. 股票控件android,一个Android股票应用(含源码)
  10. 计算机怎么打字快,电脑新手如何快速打字?
  11. 转 Unity绳子插件Obi+Rope下载与简单使用方法
  12. 【验证狼人杀三行定律】
  13. Android 适配Dark Theme(暗黑模式),看完跪了
  14. 用户使用手册与测试报告
  15. 口腔医学会计算机专业委员会,2019年中华口腔医学会口腔医学计算机专业委员会第十七次全国口腔医学数字化学术会议第二轮会议通知...
  16. 项目实战:借鉴Android API源码(Splitter-split和TextView-setText),不惧NullPointerException(文末彩蛋)
  17. fastadmin框架前台常用语句
  18. 提高存款准备金率意味什么?
  19. Java的UDP服务端
  20. 神州数码易拓TIPTOP ERP集成WEB应用(使用Flexigrid插件)

热门文章

  1. 【网摘阅读】舒迅:产品经理必读的九步法
  2. log4net.SignalR - 日志即时发送客户端页面
  3. CSS Library
  4. 现在为什么面对着人多,陌生人的时候会紧张?
  5. Unrecognised tag: 'build'
  6. Concurrent实现原理
  7. 生成javascript正则表达式语法图
  8. Spring远程调用技术1-RMI
  9. 获取本机IP_考虑多网卡的情况
  10. wcf系列5天速成——第二天 binding的使用(2)(转载)