zoukankan      html  css  js  c++  java
  • 引用与指针的区别

    在c++函数中,形式参数用 引用 和用指针都可以起到在被调用函数中改变调用函数的变量的作用。什么时候用引用作参数?什么时候用指针作参数呢 void function (int *ptr); void function(int &ref);
        没有 特定的规定。。学的 久了,就 会习惯什么时候用指针什么时候用引用了!
    引用与指针有什么区别?
    1) 引用必须被初始化,指针不必
    2) 引用初始化以后不能被改变,指针可以改变所指的对象。
    3) 不存在指向空值的引用,但是存在指向空值的指针。
        C++中尽量用引用。个人觉得所有的引用都可以用指针,但指针比引用容易出错。
        引用当然更直观更直接,做参数时,如果在函数内不刻意要用指针的那些副作用(如越界访问,动态定向什么的),引用可以代替指针。
        C++ 中一般都用引用就可以了 ... C 中没有引用,就使用指针 ....
        举例如下:
    1 使用指针传递参数时:
    void function (int *ptr) { 函数体;}
    调用该函数时
    main()
    { int p; function (&p); }
    2 使用引用传递参数时:
    void function(int &ref) { 函数体;}
    调用该函数时
    main()
    { int p; function (p); }
    由此可见,使用引用比使用指针传递参数函数调用时更简单,引用和指针功能大体相同,但是有空间分配时建议最好使用指针,因为在释放空间时,
    对指针只需要delete就行了,而引用是不能删除空间的,引用必须指向一个存在的对象。

        指针和引用的差别
    1. 非空的差别任何情况下都不能使用指向空值的引用.一个引用必须总是指向某个对象. 不存在的指向空值的引用这个事实意味着使用引用的代码效率比使用指针要高.
    2. 合法性区别在使用引用之前不需要测试他的合法性.指针必须测试.
    3. 可修改区别指针可以被重新赋值给另一个不同的对象.但是引用总是指向在初始化的时候被制定的对象,以后不能改变.但是指定的对象其内容可以改变.
    应该使用指针的情况: 可能存在不指向任何对象的可能性 需要在不同的时刻指向不同的对象(此时,你能够改变指针的指向)
    应该使用引用的情况: 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,使用此时应使用引用。
       
    要首先好好理解指针和引用的区别
        指针与引用看上去完全不同(指针用操作符’*’和’->’,引用使用操作符’.’),但是它们似乎有相同的功能。
    指针与引用都是让你间接引用其他对象。你如何决定在什么时候使用指针,在什么时候使用引用呢?
      首先,要认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,
    但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,
    例如你的设计不允许变量为空,这时你就可以把变量声明为引用。

      “但是,请等一下”,你怀疑地问,“这样的代码会产生什么样的后果?”

      char *pc = 0; // 设置指针为空值

      char& rc = *pc; // 让引用指向空值

      这是非常有害的,毫无疑问。结果将是不确定的(编译器能产生一些输出,导致任何事情都有可能发生),应该躲开写出这样代码的人除非他们同意改正错误。
    如果你担心这样的代码会出现在你的软件里,那么你最好完全避免使用引用,要不然就去让更优秀的程序员去做。我们以后将忽略一个引用指向空值的可能性。

      因为引用肯定会指向一个对象,在C里,引用应被初始化。

      string& rs; // 错误,引用必须被初始化
      string s("xyzzy");
      string& rs = s; // 正确,rs指向s

      指针没有这样的限制。
      string *ps; // 未初始化的指针
                // 合法但危险

      不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。

      void printDouble(const double& rd)
      {
       cout << rd; // 不需要测试rd,它
      }       // 肯定指向一个double值

      相反,指针则应该总是被测试,防止其为空:

      void printDouble(const double *pd)
      {
       if (pd)
       {// 检查是否为NULL
        cout << *pd;
       }
      }

      指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。

      string s1("Nancy");
      string s2("Clancy");

        string& rs = s1; // rs 引用 s1
      string *ps = &s1; // ps 指向 s1
      rs = s2; // rs 仍旧引用s1
              // 但是 s1的值现在是"Clancy"

        ps = &s2; // ps 现在指向 s2;// s1 没有改变

      总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),
    二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
     还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。

      vector<int> v(10); //建立整形向量(vector),大小为10
                        //向量是一个在标准C库中的一个模板
      v[5] = 10; // 这个被赋值的目标对象就是操作符[]返回的值

      如果操作符[]返回一个指针,那么后一个语句就得这样写:

      *v[5] = 10;

      但是这样会使得v看上去象是一个向量指针。因此你会选择让操作符返回一个引用
      当你知道你必须指向一个对象并且不想改变其指向时,或者在重载操作符并为防止不必要的语义误解时,你不应该使用指针。
    而在除此之外的其他情况下,则应使用指针 。

  • 相关阅读:
    Explain执行计划
    SQL优化(SQL + 索引)
    SQL(含索引)
    分组聚合 merger
    服务分组 group
    多注册中心 registry
    多协议 protocol
    常用协议 —— webservice://
    常用协议 —— http://
    最强AngularJS资源合集
  • 原文地址:https://www.cnblogs.com/wangliangliang/p/3178983.html
Copyright © 2011-2022 走看看