精华内容
下载资源
问答
  • C++值传递和引用传递的区别

    千次阅读 2020-05-27 17:16:02
    c++中参数传递的区别: 1.传递: 可以想象改变的只是实参的“替身”的,而实参本身不会被改变。...2.引用传递 可以想象成是“同一个人”,只不过把名字换了换,但本质上还是同样的。 因此,引用并不分配独

    c++中参数传递的区别:

    1.值传递:

    可以想象改变的只是实参的“替身”的值,而实参本身不会被改变。

    值传递:将实参的值传递给形参;形参是实参的“替身”,但与实参本质上不是“同一个人”,只是值复制过来一样而已。因此,形参有自己独立的存储空间。
    在这里插入图片描述
    当swap函数被调用时,为形参x,y分配存储空间,并且复制a,b的值过来,函数执行完毕之后,X,Y的值被调换,之后释放x,y的存储空间,并不会对a,b有任何影响。

    2.引用传递

    可以想象成是“同一个人”,只不过把名字换了换,但本质上还是同样的。

    因此,引用并不分配独立的存储空间,它与目标变量共用内存空间。如果该引用不是用作函数的参数或者返回值,则必须提供该引用的初始值。
    在这里插入图片描述
    当swap之后,形参中的值被交换,则相应的实参的值也被改变。

    说明:

    使用引用传递可以通过形参的值直接改变实参的值,而使用值传递不可以。

    参照文章:参照文章

    展开全文
  • 另一方面,传递由于形参实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...
  • C++中值传递和引用传递的区别

    万次阅读 多人点赞 2017-12-06 10:25:39
    C++值传递和引用传递的区别 一例呼醒迷中人

        最近补数据结构和算法时,捎带着学了些C++,刚好看到一篇关于值传递和引用传递的文章,收获颇丰,这里分享一下学习心得,当然,C#中也差不多。

        C++中参数的传递方式:

    1.值传递

        调用时,将实参的值传递对应的形参,即为值传递。由于形参有自己独立的存储空间,又作为函数的局部变量使用,因此在函数中对任何形参值得修改都不会改变实参变量的值。简单的看一个例子:


    编译后,输出结果如下所示:


    从上图可以看出,主函数声明了两个全局变量a,b并对其赋值1,2;通过函数Swp()函数调用之后,在函数内部将a和b的值交换了,使得函数内,a=2,b=1;但是,这个过程并没有改变全局变量a和b的值。

    我们分析一下函数的调用过程:函数Swap()被调用前,实参a和b有自己的存储空间,并且有自己的初始值。当调用函数Swap()时,为形参(即函数的参数)x和y分配存储空间,并将a和b的值复制过来,函数执行过程中,将x和y的值进行交换,当函数执行结束之后,x和y所占用的存储空间将被释放,这种传递的方式,并不会对实参a和b的值产生影响,此即为值传递。

    2.引用传递

        引用传递是一种特殊的变量,它被认为是一个变量的别名。当定义一个引用时,其实是为目标变量起一个别名,引用并不分配独立的内存空间,它与目标变量公用其内存空间,当定义一个引用时,如果该引用不是用作函数的参数或者返回值,则必须提供该引用的初始值(即必须提供引用的目标变量名)如图:

    b变量引用了a变量,可知a和b的值相等,均公用同一块内存地址,即变量b是a变量的一个别名。

    将上面的值传递的示例代码修改为引用传递如下图所示:


    编译运行,输出结果如下所示:


    当函数未调用之前,实参a和b的值分别为1和2。当函数调用过程中,形参的值被交换,即a=2,b=1;函数调用结束之后,实参的值被改变。即函数调用时,作为形参的引用变量并不分配新的内存空间,它将作为实参变量的别名与其共用内存。

        说明:使用引用参数可以直接操作实参变量,从而能够实现通过修改形参的值而达到修改对应实参值得目的。当引用作为函数形参,其引用的目标变量没人为调用该函数时对应的实参变量名,所以,在定义函数时,对于引用类型参数不必提供引用的初始值。

        欢迎关注我的公众号,会不定期的分享:设计模式、C++、数据结构和算法、Unity相关的文章:




    展开全文
  • 上面的1,2,3分别是传递,地址传递,和引用传递。 先看传递。swap1函数的操作是将x,y进行对调。需要注意的是,对形参的操作不会影响到a,b。我们可以设想,在swap1函数执行语句的最前面,隐含地存在x=a; y=...

    首先,看以下三段代码。

    1. 

    void swap1(int x, int y)  
    {
      int tmp=x;
      x=y;
      y=tmp;
      print(“x=%d, y=%d\n”, x, y);
    }
    
    void main()
    {
      int a=2,b=7;
      swap1(a,b) ;
      printf(“a=%d, b=%d\n”, a, b);
    }
    

    输出结果是什么?

    ---

    x=7, y=2

    a=2, b=7

     

    2. 

    void swap2(int *px, int *py)
    {
      int tmp=*px;
      *px=*py;
      *py=tmp;
      print(“*px=%d, *py=%d\n”, *px, *py);
    }
    
    void main()
    {
      int a=2;
      int b=7;
      swap2(&a,&b);
      Print(“a=%d, b=%d\n”, a, b);
    }
    

    这次输出结果是什么?

    ---

    *px=7, *py=2

    a=7, b=2

    3. 

    void swap3(int &x, int &y)
    {
      int tmp=x;
      x=y;
      y=tmp;
      print(“x=%d, y=%d\n”, x, y);
    }
    
    void main()
    {
      int a=2;
      int b=7;
      swap3(a,b);
      Print(“a=%d, b=%d\n”, a, b);
    }
    

    那这次输出结果又是什么?

    ---

    x=7, y=2

    a=7, b=2

     

    接下来,分析一下为什么是这样的结果呢?

    上面的1,2,3分别是值传递,地址传递,和引用传递。

    先看值传递。swap1函数的操作是将x,y进行对调。需要注意的是,对形参的操作不会影响到a,b。我们可以设想,在swap1函数执行语句的最前面,隐含地存在x=a; y=b;这两条语句,这样就便于理解了。当a,b把值赋给x,y之后,对x,y不论再做什么操作,都不会影响到a,b本身。

     

    再看地址传递。注意,这时的函数的声明和调用的写法与值传递不同。

    函数声明:swap2(int *px, int *py)

    函数调用:swap2(&a, &b)

    但是与值传递的分析一样,我们同样可以设想,在swap2函数里,隐含地存在px=&a; py=&b;这两条语句,这表示a的地址代入到了px,b的地址代入到了py。这样一来,对*px, *py的操作就是a,b本身的操作。所以a,b的值被对调了。

     

    接下来看引用传递。先看函数的声明和调用的写法,函数调用和值传递的写法是一样的,但是函数声明是不一样的。

    函数声明:swap3(int &x, int &y)

    函数调用:swap3(a, b)

    因为定义的x,y前面有&取地址符,调用函数swap3时,a,b分别代替了x,y,即x,y分别引用了a,b变量。因此,函数里的操作,实际上是对实参a,b本身的操作,其值发生了对调。

     

    展开全文
  • 主要介绍了C++引用传递与指针传递的区别(面试常见),需要的朋友可以参考下
  • C/C++语言中值传递、指针传递和引用传递

    万次阅读 多人点赞 2018-01-06 00:09:00
    在C语言中值传递、指针传递和引用传递这三种函数参数传递方式是比较基本的知识,用的比较普遍,但不仔细分析其实质的话,时间长容易记混了。网上的资料也较多但多数都不系统,本文力求用最白话的表达简单的示例把...

    在C/C++语言中值传递、指针传递和引用传递(C++ only)这三种函数参数传递方式是比较基本的知识,用的比较普遍,但不仔细分析其实质的话,时间长容易记混了。网上的资料也较多但多数都不系统,本文力求用最白话的表达和简单的示例把这三种方式描述清楚。没时间看分析的直接看简述就可以了。

    简述

    值传递就是最普通的传递方式,比如函数定义为fun(int a),在调用的地方有int x=6, 使用fun(x)就可以了。这种方式在fun(int a)函数内部的对a的修改 不能 导致外部x的变化。
    指针传递其实也就是地址传递,函数定义为fun(int *a),形参为指针,这就要求调用的时候传递进去一个参数的地址,例如int x=6; fun(&x)。 这种方式在fun(int a)函数内部的对a的修改 导致外部x的变化。
    引用传递只有C++支持,相比前两种方式用的比较少,但也非常有用。引用传递函数定义为fun(int &a),这里&符号是引用而不是取地址的意思,调用方式和值传递类似,例如int x=6; fun(x)。 但是这种方式在fun(int a)函数内部的对a的修改 导致外部x的变化。

    表格是一种比较直接的表达方式,列个表格可以对这三种方式一目了然,假设调用fun函数之前都有定义int x=6,这三种方式异同如下表所示:

    传递方式函数定义函数调用函数内对a修改的影响
    值传递fun(int a)fun(x)外部x不变
    指针传递fun(int *a)fun(&x)外部x同步更改
    引用传递(C++)fun(int &a)fun(x)外部x同步更改

    分析

    下面三部分代码都尝试在swap函数内对输入参数进行数值交换,通过打印其数值和指针来分析。

    值传递

    函数内部使用这个参数,对这个参数的修改对函数外的原始数据不起作用。

    示例:

    #include <stdio.h>
    
    void swap(int a, int b){
        printf("swap enter\n");
        printf("a = %d, ptr = %p\n", a, &a);
        printf("b = %d, ptr = %p\n", a, &b);
    
        int tmp = b;
        b = a;
        a = tmp;
    
        printf("a = %d, ptr = %p\n", a, &a);
        printf("b = %d, ptr = %p\n", b, &b);
        printf("swap leave\n");
    }
    
    int main() {
        int x = 1;
        int y = 2;
        printf("x = %d, ptr = %p\n", x, &x);
        printf("y = %d, ptr = %p\n", y, &y);
    
        swap(x, y);
    
        printf("x = %d, ptr = %p\n", x, &x);
        printf("y = %d, ptr = %p\n", y, &y);
    
        return 0;
    }
    

    运行结果:

    x = 1, ptr = 000000000022FE4C
    y = 2, ptr = 000000000022FE48
    swap enter
    a = 1, ptr = 000000000022FE20
    b = 1, ptr = 000000000022FE28
    a = 2, ptr = 000000000022FE20
    b = 1, ptr = 000000000022FE28
    swap leave
    x = 1, ptr = 000000000022FE4C
    y = 2, ptr = 000000000022FE48
    

    结果表明:
    swap函数内部a b的数值进行交换,但是没有影响到x y的值。swap函数形参a b所指向的内存地址和外部x y的地址不一样。
    实质:
    swap为形式参数 a b创建了内存空间,main函数调用swap函数的时候,把x y的值copy给新创建的 a ba bx y分别在不同的内存位置中,因而对这个新创建的 a b 操作不会影响外部的 x y的值。

    带有返回值的函数,比如int fun(){int x=7; return x},外部调用方式为int a=fun();,这时是把x的数值copy了一份给外部a所在的内存空间,并释放了x所在的内存空间(系统自动分配的栈内存),在fun函数调用后即使知道x的内存地址也可能取不到相应的数据。
    返回值为指针的函数,比如char *fun(){...; return str;},函数中待返回的变量必须是使用malloc等函数手动申请空间(堆内存)的数据,且外部使用后要手动释放。因为系统自动申请的栈内存会在函数调用后自动释放。

    指针传递(地址传递)

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

    示例:

    #include <stdio.h>
    
    void swap(int *a, int *b){
        printf("swap enter\n");
        printf("a = %d, ptr = %p\n", *a, a);
        printf("b = %d, ptr = %p\n", *a, b);
    
        int tmp = *b;
        *b = *a;
        *a = tmp;
    
        printf("a = %d, ptr = %p\n", *a, a);
        printf("b = %d, ptr = %p\n", *b, b);
        printf("swap leave\n");
    }
    
    int main() {
        int x = 1;
        int y = 2;
        printf("x = %d, ptr = %p\n", x, &x);
        printf("y = %d, ptr = %p\n", y, &y);
    
        swap(&x, &y);
    
        printf("x = %d, ptr = %p\n", x, &x);
        printf("y = %d, ptr = %p\n", y, &y);
    
        return 0;
    }
    

    运行结果:

    x = 1, ptr = 000000000022FE4C
    y = 2, ptr = 000000000022FE48
    swap enter
    a = 1, ptr = 000000000022FE4C
    b = 1, ptr = 000000000022FE48
    a = 2, ptr = 000000000022FE4C
    b = 1, ptr = 000000000022FE48
    swap leave
    x = 2, ptr = 000000000022FE4C
    y = 1, ptr = 000000000022FE48
    

    结果表明:
    swap函数内部a b的数值进行交换,外部的x y的值也发生了交换。swap函数形参a b所指向的内存地址和外部x y的地址分别都相同。
    实质是:
    swap函数形式参数其实是一个指针,可能把fun(int *a)写成fun(int* a)就比较容易理解了,形参a为地址指针。*a就是xa就是&x。函数内部要想修改其数值就要使用*a取数值,打印其地址直接打印a就可以了。
    函数内部对a b的操作实际上是操作x y所在的内存空间,所以函数内的修改会影响到外部x y的数值。

    引用传递

    引用传递的形参加一个&符号,这个形参相当于实参的一个别名,对形参的操作都相当于对实参的操作。
    注意形参带&符号的引用传递在C语言中是不可用的,只有C++中支持。
    C语言中函数参数总是通过值传递,可以通过显式传递指针值模拟引用传递。

    Function parameters are always passed by value. Pass-by-reference is simulated in C by explicitly passing pointer values. – https://en.wikipedia.org/wiki/C_(programming_language)

    示例:

    #include <stdio.h>
    
    void swap(int &a, int &b){
        printf("swap enter\n");
        printf("a = %d, ptr = %p\n", a, &a);
        printf("b = %d, ptr = %p\n", a, &b);
    
        int tmp = b;
        b = a;
        a = tmp;
    
        printf("a = %d, ptr = %p\n", a, &a);
        printf("b = %d, ptr = %p\n", b, &b);
        printf("swap leave\n");
    }
    
    int main() {
        int x = 1;
        int y = 2;
        printf("x = %d, ptr = %p\n", x, &x);
        printf("y = %d, ptr = %p\n", y, &y);
    
        swap(x, y);
    
        printf("x = %d, ptr = %p\n", x, &x);
        printf("y = %d, ptr = %p\n", y, &y);
    
        return 0;
    }
    

    运行结果:

    x = 1, ptr = 000000000022FE4C
    y = 2, ptr = 000000000022FE48
    swap enter
    a = 1, ptr = 000000000022FE4C
    b = 1, ptr = 000000000022FE48
    a = 2, ptr = 000000000022FE4C
    b = 1, ptr = 000000000022FE48
    swap leave
    x = 2, ptr = 000000000022FE4C
    y = 1, ptr = 000000000022FE48
    

    结果表明:
    函数内对形参的使用方式和值传递相同,产生的效果和指针传递相同。
    swap函数内部a b的数值进行交换,外部的x y的值也发生了交换。swap函数形参a b所指向的内存地址和外部x y的地址分别都相同。

    实质是:
    形式参数前加&符号,这个形参相当于实参的一个别名,对这个形参的操作等同于对实参的操作,有点类似快捷方式。a等同于x,比如fun(int &a)函数内对a的操作和值传递的函数fun(int a)中对形参的操作一样,但是修改形参同时也是修改实参。

    展开全文
  • C++ 传递地址传递和引用传递

    千次阅读 多人点赞 2020-02-19 17:50:24
    C++ 值传递和地址传递 在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下: 在数据传递时,分为值传递和地址传递值传递:在函数调用时实参将...
  • 缺省情况下C++值传递方式传递对象到函数。除非你另外指定,否则函数参数都是以实际参数的复件(副本)为初值,而调用端所获得的亦是函数返回值得一个副本。这些复件由copy构造函数产生,会造成昂贵的费时操作。举...
  • // // main.cpp // Basic // // Created by 06 on 15/1/9. // Copyright (c) 2015年 黄永锐. All rights reserved. // #include using namespace std;...//引用传递 void fa(int &r){ r++; //shuchu dizi
  • 浅谈C/C++值传递、地址传递、引用传递共同的困惑什么是函数形式参数实体参数功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个...
  • C++引用传递与指针传递的区别

    万次阅读 多人点赞 2018-06-25 19:16:40
    概念 指针从本质上讲是一个变量,变量的是另一个变量的地址,指针在逻辑上是独立的,它可以被改变的,包括指针变量的(所指向的地址)指针变量的对应的内存中的数据(所指向地址中所存放的数据)。 引用...
  • 主要参考:https://blog.csdn.net/superhill/article/details/7446669 今天写改bug的时候突然就发现了这样一个问题: int a = 1; int b = a; ...b的是0还是1?...b的又为不为空?...实际上这就是类似于c++的...
  • 一:传递,引用传递,地址传递 #include<iostream> using namespace std; //传递 void swap(int a, int b) { int temp = a; a = b; b = temp; cout << "使用传递a的为:" << a <&...
  • C++ 传递、指针传递、引用传递详解 最近写了几篇深层次讨论数组指针的文章,其中提到了“C语言中,所有非数组的形式参数传递均以传递形式” 数组指针背后——内存角度 语义"陷阱"---数组...
  • 以下,是将引用、指针,以及引用传递和值传递的比较好的讲解。 http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html http://blog.csdn.net/zzuqqiu/article/details/5617263 ...
  • 值传递 :形参获得之后与实参脱离关系 引用 首先,引用的定义使用如下: #include using namespace std; int main() { int a=56; int &ai=a; cout; a=96; cout; ai=15; cout<<"
  • 为什么 Java 只有传递,但 C++ 既有传递,又有引用传递呢?今天我们就来探讨下这个问题,有需要的朋友可以参考下
  • 现在让我们来看一下传递,指针传递和引用传递的形参变量实参变量的地址,main函数如下: #include using namespace std; // mySwap函数的声明定义放在这里 int main() { int n = 15, m = 20; cout ...
  • 举个栗子,分析一下C++传递、引用传递和指针传递的区别: #include "transmit.h" #include <iostream> using namespace std; //按传参 void changeValue(int x) { x = x + 5; cout << "地址...
  • 区别1:指针传递和引用传递是以不同的方式实现相同的效果,但是指针传递的本质还是传递,只是传递的是地址。 就拿 交换两个数的函数来举例: // 指针传递 void swap(int * val1, int * val2) { int temp...
  • Java 是传递还是引用传递

    万次阅读 多人点赞 2019-03-20 02:40:16
    最近整理面试题,整理到传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 ...
  • 函数参数引用and值传递最近在写函数的时候突然思考的问题。 场景: typedef boost::shared_ptr<CShortcutApproval> CShortcutApprovalPtr void mergePermission( CShortcutApprovalPtr pUserPermission, ...
  • C++线程的参数传递值传递和引用

    千次阅读 2018-07-11 09:20:49
    前言 线程一般通过复制或引用获取其数据。 默认情况下,您应该用一个副本。 为啥呢?如果您的线程通过引用获取其数据,那得非常小心参数的生命周期。...C++11" } std::thread t([=] { ...
  • C++ 引用传递和值传递

    2016-09-11 08:32:30
    函数引用传递可以改变变量本身的。 #include using namespace std; int main() { void fun(int x,int y); void fun1(int& x,int& y); int x=1,y=2; fun(x,y); cout; int &p1=x,&
  • 首先我们写出一段程序,这段程序用来介绍两种传递方式的区别。include using namespace std; void swap1(int a,int b); void swap2(int* a,int *b); void swap3(int& a,int& b); int main() { int a=2,b=3; swap1...
  • 文章目录1 C++ 传递、指针传递、引用传递详解传递:指针传递:引用传递:2 数组作为函数的形参2.1 一维数组传递2.2 二维数组传递总结 1 C++ 传递、指针传递、引用传递详解 传递: 形参是实参的拷贝,改变...
  • 1.值传递 所谓值传递,就是函数调用时实参将数值传入给形参 值传递时,如果形参发生改变,并不会影响实参 void swap(int a, int b) { int temp = a; a = b; b = temp; cout << "swap函数中a = " <&...
  • 大多数人都知道,使用传递对形参的更改不会影响实参,但是地址传递和引用传递却会, 最经典的例子莫过于交换两个数字。 但是,为什么在使用传递的时候,传递一个地址给行参依然没有影响到实参了,是因为改变只...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 188,694
精华内容 75,477
关键字:

c++值传递和引用传递

c++ 订阅