值传递、指针传递、引用传递的区别
转自:http://hi.baidu.com/lewutian/blog/item/16436cfabb8a99d5b58f3158.html
C++中值传递、指针传递、引用传递的总结 收藏
1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
用gdb调试后发现,x,y的地址分别是0xffbef938, 0xffbef934, 值分别是1,2。而形参a,b的地址分别是0xffbef918,0xffbef914, 虽然它们存储的值和x,y一样,都是1,2,但是这只是拷贝过来的。swap只交换了a,b,并不会改变x,y的值。输出为2,1;1,2
2. 指针传递:
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
cout<<*a<<’ ‘<<*b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(&x,&y);
cout<<x<<’ ‘<<y<<’\n’;
}
输出结果是2,1;2,1。实参x,y, 形参a,b的地址同上,但是a,b的内容分别为0xffbef938(x的地址),0xffbef934(y的地址),*a也就是0xffbef938内存中存放的内容,即x的值1。简单地说,a是一个指向外部实参地址的指针,*a是指针的内容,如果改变了*a也必然导致外部实参的改变。
3. 引用传递:
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=1;
int y=2;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return 0;
}
输出是2,1;2,1。实参x,y的地址同上。然而与指针传递不同的是,形参a,b的地址也与x,y相同,即0xffbef938, 0xffbef934。这样一来,交换a,b就相当于交换x,y。
指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者。对比值传递,指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改)。指针/引用传递的另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。
至于指针/引用传递的格式,可以参考以下的内容:
int x=1;
int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值
int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样
最后再啰嗦一个例子:
int change1(char* name){
name=”alter”;
return 1;
}
int change2(char* &name){
name=”alter”;
return 1;
}
int main(){
char* string=”original!”;
change1(string);
cout<<string<<’\n’;
change2(string);
cout<<string<<’\n’;
}
结果:original!;alter。change1是值传递,形参name有自己独立的内存地址,内容是拷贝string的内容(string的内容是”original”的地址),修改后name的内容变成了“alter”的地址。change2是引用传递,形参name的地址就是string的地址,或者说name就是string
转载于:https://blog.51cto.com/568464209/1721076
值传递、指针传递、引用传递的区别相关推荐
- qt槽函数如何传递多个参数_【Qt】信号和槽对值传递参数和引用传递参数的总结...
在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...
- 【Qt】信号和槽对值传递参数和引用传递参数的总结
在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...
- [转载] java中对象作为参数传递给一个方法,到底是值传递,还是引用传递
参考链接: 用Java传递和返回对象 看完绝对清晰~ java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型 值传递:引用类型,地址值传递,所 ...
- 值传递,还是引用传递(实践是检验真理的唯一标准)
package com.c9;import java.util.ArrayList;//值传递,还是引用传递? /* 1, list,保持一致:有效2,实体bean,保持一致,有效3, string, ...
- 递归中的引用传递和常引用传递
通过递归加深引用传递和常引用传递的区别,同时加深递归回溯的过程 void process(string& str) {if (str.size() >= 5) {cout << ...
- 【基础中的基础】引用类型和值类型,以及引用传递和值传递
一直在博客园怼人,非常惭愧.所以郑重决定: 好好写一篇干货,然后再接着怼人. 这是一起帮上陈百万同学的求助,讲了一会之后,我觉得很有些普世价值,干脆就发到园子来.面向小白,高手轻拍. 我们从最简单的说 ...
- java还值_Java到底是引用传递还是值传递
前言 前段时间在群里看到类似这样一个问题,下面的代码会输出什么呢? public void test(){ String str = "hello"; change(str); S ...
- 什么是值传递?什么是引用传递?
值传递是传递变量的值,并不会改变方法外变量的值:引用传递是传递对象的地址,会改变对象本身的值: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用 ...
- Java 函数传递对象是引用传递还是值传递?
class A {int val; }public class main {public static void fun(A a, A b) {// a.val = 6;a = b;}public s ...
- 指针与引用有什么区别?
指针(Pointer)持有另一个对象的地址,使我们能够间接地操作这个对象.引用(Reference)有时候又称为别名,它可以用作对象的另一个名字.它们都是让你间接引用其他对象. 从语法的角度比较,二者 ...
最新文章
- 新浪微博推广网站的一些实践体会
- 用友服务器整体迁移--数据库附加
- domino大百科常见问题总汇1(转载)
- spring-java.lang.stackOverFlowError
- windows进程管理器_软件进程自动重启一遍又一遍……你需要这款自动杀进程的小公举ProcessKO...
- 《Windows驱动开发技术详解》读书笔记(一)
- 石家庄学院c语言试题,谁会高级语言程序设计?要求用C语言,帮帮我把,愁死我啦...
- java File类入门学习
- 「版本升级」MyEclipse CI 2018.12.0正式发布
- 20个Flutter实例视频教程-01节底部导航栏和切换效果的制作-1
- 网页无法保存html文件,怎么保存无法保存的网页
- 使用计算机能播放音乐也能观看视频,我电脑可以放歌有声音。怎么播放视频没声音啊?给我解决方案...
- 企业微信定时发送图片/文字信息
- excel表格怎么恢复?常见的恢复方法
- 饥荒联机版 服务器未响应,饥荒联机版常见问题汇_饥荒联机版常见问题大全_快吧单机游戏...
- 读书笔记-定时询问寻求帮助
- windows常用 API函数
- TaLib金融工具库
- 计算两个向量的互信息(Mutual Information) matlab程序
- python 主程序等待 子线程_Python多线程中主线程等待所有子线程结束的方法