• 【转载】比较c++中的值传递,引用传递,指针传递


    很久没有上了,这段时间挺忙的,不过看到这篇好文章,还是转载一下,文章直截了当说明了值传递、引用传递和指针传递三者之间的不同,它厘清了三者之间模糊的边界,对理解C++是十分有益的。

    原文网址:http://windshowzbf.bokee.com/2631833.html

    关键词: c++    值传递    引用传递    指针传递                                    

    在vc6.0下,写了个简单的程序!

    vc6.0中,File->new->SourceFile

    #include "stdio.h"

    #include "iostream.h"

    void DeliByValue(int x);

    void DeliByReference(int &x);

    void DeliByPointer(int *x);

    void main()

    {

     int number=0;

     DeliByValue(number);

     cout<<number<<endl;

     number=0;//重新归0

     DeliByReference(number);

     cout<<number<<endl;

     number=0;//重新归0

     DeliByPointer(&number);

     cout<<number<<endl;

    }

    void DeliByValue(int x)

    {

           x = x+10;

    }

    void DeliByReference(int &x)

    {

           x=x+10;

    }

    void DeliByPointer(int *x)

    {

           (*x) = (*x)+10;

    }

    运行结果如下:0

                               10

                               10

    通过这个程序进行的比较可以看出,在书写值传递,引用传递,指针传递这三个函数和调用这三个函数的区别。

    林锐在《高质量c++编程指南》中对此有介绍:

    附上:

    引用是C++中的概念,初学者容易把引用和指针混淆一起。一下程序中,n是m的一个引用(reference),m是被引用物(referent)。

        int m;

        int &n = m;

    n相当于m的别名(绰号),对n的任何操作就是对m的操作。例如有人名叫王小毛,他的绰号是“三毛”。说“三毛”怎么怎么的,其实就是对王小毛说三道四。所以n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己。

    引用的一些规则如下:

    (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

    (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

    (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

        以下示例程序中,k被初始化为i的引用。语句k = j并不能将k修改成为j的引用,只是把k的值改变成为6。由于k是i的引用,所以i的值也变成了6。

        int i = 5;

        int j = 6;

        int &k = i;

        k = j; // k和i的值都变成了6;

        上面的程序看起来象在玩文字游戏,没有体现出引用的价值。引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。

        以下是“值传递”的示例程序。由于Func1函数体内的x是外部变量n的一份拷贝,改变x的值不会影响n, 所以n的值仍然是0。

        void Func1(int x)

    {

        x = x + 10;

    }

    int n = 0;

        Func1(n);

        cout << “n = ” << n << endl; // n = 0

       

    以下是“指针传递”的示例程序。由于Func2函数体内的x是指向外部变量n的指针,改变该指针的内容将导致n的值改变,所以n的值成为10。

        void Func2(int *x)

    {

        (* x) = (* x) + 10;

    }

    int n = 0;

        Func2(&n);

        cout << “n = ” << n << endl;     // n = 10

        以下是“引用传递”的示例程序。由于Func3函数体内的x是外部变量n的引用,x和n是同一个东西,改变x等于改变n,所以n的值成为10。

        void Func3(int &x)

    {

        x = x + 10;

    }

    int n = 0;

        Func3(n);

        cout << “n = ” << n << endl;     // n = 10

    //好好理解“值传递”“指针传递”“引用传递”(zbf)

        对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?

    答案是“用适当的工具做恰如其分的工作”。

        指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?

    如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。

  • 相关阅读:
    31天重构学习笔记23. 引入参数对象
    31天重构学习笔记31. 使用多态代替条件判断
    31天重构学习笔记25. 引入契约式设计
    新加坡面试经历
    Release a AutoUpdater tool
    31天重构学习笔记24. 分解复杂判断
    31天重构学习笔记29. 去除中间人对象
    自动更新组件分享
    WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)
    (收藏)2010年度十大杰出IT博客
  • 原文地址:https://www.cnblogs.com/alonecat06/p/1323100.html
Copyright © 2020-2023  润新知