C++中的值传递 指针传递 和 引用传递


C++中参数传递有三种:传递参数值、传递参数地址、传递参数的引用。

一、概念分解

1. 值

2. 指针

  指针从本质上讲 就是存放 变量地址的 一个变量, 在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向地址中所存放的数据的改变。

3. 引用

  引用是一个别名,在逻辑上不独立,它的存在具有依附性,所以引用必须在一开始就被初始化,而且在其生命周期中是不能改变的其引用的对象(即不能重新赋值,自始至  至终都只能依附于同一个变量)

二、概念详解

1. 值传递:

  形参是实参的拷贝,改变形参的值并不会影响外部实参的值。

  从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出;

  当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。

2. 指针传递

  形参是指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作

3. 引用传递

  形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作。

  在引用传递过程中,被调函数的形式参数 作为局部变量 在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。

  被调函数对形参的任何操作都被处理成间接寻址,即 通过栈中存放的地址访问主调函数中的实参变量。

  正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

三、引用和指针 对比

1. 相同点

  都是地址的概念;

  指针指向一块内存,它的内容是所指内存的地址;

  引用则是某块内存的别名。

2. 不同点

  指针是一个实体,而引用仅是个别名;

  引用只能在定义时被初始化一次,之后不可变;指针随时可变;

  const:引用只有 const int& a;(引用所指向的值不可以变);没有int& const a;(引用本身即别名不可变,这是当然的,所以不需要这种形式);指针均有;

  引用不能为空,指针可以为空;

  引用是类型安全的,而指针不是;(引用比指针多了类型检查)

  sizeof 引用 的到是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小

四、应用

引用传递的性质像 指针传递,但是书写像 值传递。

值传递:

void Func1(int x)

{

  x = x+1;

}

指针传递:

void Func1(int *x)

{

  *x = *x +1;

}

引用传递:

void Func1(int &x)

{

  x = x+1;

}

实际上,用“引用”可以做的任何事情“指针”也能够做,但是为什么还要“引用“?

->指针太灵活,可以毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险;

如果的确只需要借用下 某个 对象的 别名, 那么就用引用,以免发生意外。

Reference:

1. http://blog.csdn.net/htsnoopy/article/details/7070819

2. http://blog.csdn.net/zzuqqiu/article/details/5617263

3. http://blog.csdn.net/xiaocai0807/article/details/6526672

时间: 2024-12-27 14:02:59

C++中的值传递 指针传递 和 引用传递的相关文章

java只有值传递,不存在引用传递

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟悉的值传递

为什么 Java 只有值传递,但 C# 既有值传递,又有引用传递,这种语言设计有哪些好处?

为什么 Java 只有值传递,但 C# 既有值传递,又有引用传递,这种语言设计有哪些好处? http://www.zhihu.com/question/20628016 Java值传递的终极解释 http://developer.51cto.com/art/201103/251163.htm

函数何时值传递,何时指针,何时引用传递总结

编程中定义函数,一般三种传递方法,看是简单.想灵活合理选择,还须要大量的编程经验和技巧. 故在这里特意总结一下这三种传递的方法. 根本差别: 函数值传递不改变变量值,假设想改变变量值,须要返回值,然后用变量接收一下这个返回值. 而指针传递和引用传递都能够在函数内改变变量值.不须要通过返回值的形式改变. 应用场合: 当想通过这个函数.改变好几个变量的值,多个变量都通过函数返回值来改变变量值方式费时费力.所以这样的场合就比較适合使用指针和引用. 指针传递须要开内存.假设忘记释放的话,可能导致内存泄露

C++中值传递、指针传递、引用传递的总结

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

值传递,指针传递;引用传递(c++独有)本质

要理解值传递.指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量.栈),内存的布局以及指针和引用的特点.这里主要总结三种参数传递方式使用的主要场合. 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递. 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销.如果需要改变指针本身,可以使用二重指针或者指针引用. 引用传递:除了提供输入值外,还返回操作结果,无需复制开销. #include<stdlib.h> //值传递,函数体内变量n是参数

【转】值传递、指针传递、引用传递的区别

1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出.当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递. void swap(int a,int b){     int temp;     temp=a;     a=b;     b=temp;     cout<<a<<’ ‘<<b<<’\n’;} int main(){     in

Java语言中的值传递与引用传递

Java应用程序中永远不会传递对象,而只会传递对象应用,因此,按对象引用传递. (1)      Int作为参数传递时,对形参值得修改不会影响到实参: (2)      StringBuffer作为参数时,对形参对象内容的修改影响到了实参. (3)      值传递只是传递了一个值的副本,对形参值得改变不会影响实参的值. (4)      引用传递,由于参数的地址也是以值是方式传递的,因此,无法改变实参的地址,只能改变实参地址指向的对象的值. (5)      String对象的传递,由于Str

晨叔技术晨报: 你真的搞懂JS中的“值传递”和“引用传递”吗?

晨叔周刊,每周一话题,技术天天涨. 本周的话题是JS的内存问题(加入本周话题,请点击传送门). 图 话题入口 今天的技术晨报,就来谈谈JS中变量的,值传递和引用传递的问题.现在,对于很多的JSer来讲,基本不关心堆和栈的问题,代码照样666. 但是,现在的前端,不再是传统的JQ时代,而是MVVM,组件化,工程化.前端的承载着复杂业务逻辑.为此,内存问题,成为JSer必须要考虑的问题. 本文从堆栈讲起,让大家理解JS中变量的内存使用以及变动情况 . 一.初步了解堆栈  先初步了解JS中的堆和栈,首

JAVA中只有值传递

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:"引用传递!",并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟

java中值传递和引用传递

本来今天刚学习的内容,然后去其他博客看了下,发现都吵起来了,就是名字原因,有的说java有值传递和引用传递,有的说引用传递本质就是值传递,我管你杂说的,只要自己理解好,代码知道运行结果就好了. 我用自己的话,自己的理解来解释下,反正都是自己写着玩,自己看的 值传递:传递的值,这个值以后怎么改变,源值不会发生改变的. 引用传递:将对象的引用地址传递过去,如果值发生改变,那么源值也发生改变. 代码如下: 值传递: public class Test1 { public static void mai