C++中值传递、指针传递、引用传递的总结
 
指针传递和引用传递一般适用于:函数内部修改参数并且希望改动影响调用者。对比值传递,指针/引用传递可以将改变由形参“传给”实参(实际上就是直接在实参的内存上修改,不像值传递将实参的值拷贝到另外的内存地址中才修改)。指针/引用传递的另外一种用法是:当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量,也相当于一个隐式的返回值传递吧。

1. 值传递
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
void swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
cout<<a<<’ ‘<<b<<’\n’;
}
int main(){
int x=;
int y=;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’; return ;
}
用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=;
int y=;
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=;
int y=;
swap(x,y);
cout<<x<<’ ‘<<y<<’\n’;
return ;
}
输出是2,1;2,1。实参x,y的地址同上。然而与指针传递不同的是,形参a,b的地址也与x,y相同,即0xffbef938, 0xffbef934。这样一来,交换a,b就相当于交换x,y。
 
至于指针/引用传递的格式,可以参考以下的内容:
int x=;
int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值
int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样
最后一个例子:
int change1(char* name){
name=”alter”;
return ;
}
int change2(char* &name){
name=”alter”;
return ;
}
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

C++中值传递、指针传递、引用传递的总结的更多相关文章

  1. 【Qt】信号和槽对值传递参数和引用传递参数的总结

    在同一个线程中 当信号和槽都在同一个线程中时,值传递参数和引用传递参数有区别: 值传递会复制对象:(测试时,打印传递前后的地址不同) 引用传递不会复制对象:(测试时,打印传递前后的地址相同) 不在同一 ...

  2. Java 为值传递而不是引用传递

    ——reference Java is Pass by Value and Not Pass by Reference 其实这个问题是一个非常初级的问题,相关的概念初学者早已掌握,但是时间长了还是容易 ...

  3. java是值传递,还是引用传递?

    原文地址:http://blog.csdn.net/zxmzfbdc/article/details/5401960  java到底是值传递,还是引用传递?以前国内的java开发者有过很多争论,由于& ...

  4. c语言 函数传输传递的三种方式(值、指针、引用)

    本文摘自<彻底搞定c指针> 一.三道考题开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?)考题一,程序代码如下:void Exchg1(int x, in ...

  5. java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  6. 【Java基础】11、java方法中只有值传递,没有引用传递

    public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...

  7. java值转递?引用传递?

    值传递是传递的是原值的副本,引用传递传递的是原值. 在Java中,如果是基本数据类型,传递的是该参数字面量值的拷贝.如果是引用数据类型,传递的是该参数所引用对象在堆中地址的拷贝. swap(int a ...

  8. java都是值传递,没有引用传递

    博主这几天在复习 javaSE 部分的内容时,遇到了关于参数传值的问题,但是始终不知道原因,上网上一查才知道钻牛角尖了,把C语言的参数传值转移到java中了. 相信很多在学习java之前,有接触过C/ ...

  9. 验证python中函数传参是引用传递

    定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  10. C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习

    1)形参 形参顾名思义就是形式上的参数,不是实际的参数,它代替实际传入方法的值.在方法体代码中代表了值本身参与运算.形参定义于参数中,它不同于方法体内局部变量,因为是一个变量,在它的作用域内不允许存在 ...

随机推荐

  1. iptables中DNAT的配置方法

    1.一对一流量完全DNAT 首先说一下网络环境,普通主机一台做防火墙用,网卡两块 eth0 192.168.0.1  内网 eth1 202.202.202.1 外网 内网中一台主机 192.168. ...

  2. [POI2008]枪战Maf

    [POI2008]枪战Maf 题目 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的 ...

  3. 超超超简单的bfs——POJ-1915

    Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 26102   Accepted: 12305 De ...

  4. SQL Server数据库基础笔记

    启动和停止SQL Server服务三种形式 后台启动服务 计算机->右键->管理->服务和应用程序->服务->sql server(MSSQLSERVER) SQL Se ...

  5. PyCharm中Directory与Python package的区别

    对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清 ...

  6. PAT (Basic Level) Practise (中文) 1017. A除以B (20)

    1017. A除以B (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求计算A/B,其中A是不超过 ...

  7. akoj-1074-人见人爱A^B

    人见人爱A^B Time Limit:1000MS  Memory Limit:65536K Total Submit:91 Accepted:55 Description 求A^B的最后三位数表示的 ...

  8. UiAutomator2.0升级填坑记

    UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...

  9. 手算平方根和基于 Java BigInteger 的大整数平方根的实现

    为了实现任意大数的运算,long用BigInteger替换带哦. 好了废话少数,先说数学原理,也就是手算平方根计算机代码实现!那么什么叫手算平方根了??? 手开方图解 据说前苏联的普通工人都会的(毛熊 ...

  10. [NOIP 2010]饮水入城 搜索+贪心

    考试的时候写了个dfs找出来了,最后处理的时候想到了贪心,但是正确性没有想通.然后想了想动规,也没想通.最后没办法,用状态的话用了个状压,弄了40分. 正解是bfs+贪心.Dfs也有过的. 下面题解引 ...