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

    1.引用很容易与指针混淆,它们之间有三个主要的不同:

    • 不存在空引用。引用必须连接到一块合法的内存
    • 一旦引用被初始化为一个对象,就不能被指向另一个对象。指针可以在任何时候指向另一个对象。
    • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
    #include <iostream>
     
    using namespace std;
     
    int main ()
    {
       // 声明简单的变量
       int    i;
       double d;
     
       // 声明引用变量!!!!!!!!!!!!!!!!!简单的取了一个别名
       int&    r = i;
       double& s = d;
       
       i = 5;
       cout << "Value of i : " << i << endl;
       cout << "Value of i reference : " << r  << endl;
     
       d = 11.7;
       cout << "Value of d : " << d << endl;
       cout << "Value of d reference : " << s  << endl;
       
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    Value of i : 5
    Value of i reference : 5
    Value of d : 11.7
    Value of d reference : 11.7

    2.把引用作为参数:可以改变实参的值

    #include <iostream>
    using namespace std;
     
    // 函数声明
    void swap(int& x, int& y);
     
    int main ()
    {
       // 局部变量声明
       int a = 100;
       int b = 200;
     
       cout << "交换前,a 的值:" << a << endl;
       cout << "交换前,b 的值:" << b << endl;
     
       /* 调用函数来交换值 */
       swap(a, b);
     
       cout << "交换后,a 的值:" << a << endl;
       cout << "交换后,b 的值:" << b << endl;
     
       return 0;
    }
     
    // 函数定义
    void swap(int& x, int& y)
    {
       int temp;
       temp = x; /* 保存地址 x 的值 */
       x = y;    /* 把 y 赋值给 x */
       y = temp; /* 把 x 赋值给 y  */
      
       return;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    交换前,a 的值: 100
    交换前,b 的值: 200
    交换后,a 的值: 200
    交换后,b 的值: 100

    3.把引用作为返回值:

    #include <iostream>
     
    using namespace std;
     
    double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
     
    double& setValues( int i )
    {
      return vals[i];   // 返回第 i 个元素的引用
    }
     
    // 要调用上面定义函数的主函数
    int main ()
    {
     
       cout << "改变前的值" << endl;
       for ( int i = 0; i < 5; i++ )
       {
           cout << "vals[" << i << "] = ";
           cout << vals[i] << endl;
       }
     
       setValues(1) = 20.23; // 改变第 2 个元素
       setValues(3) = 70.8;  // 改变第 4 个元素
     
       cout << "改变后的值" << endl;
       for ( int i = 0; i < 5; i++ )
       {
           cout << "vals[" << i << "] = ";
           cout << vals[i] << endl;
       }
       return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    改变前的值
    vals[0] = 10.1
    vals[1] = 12.6
    vals[2] = 33.1
    vals[3] = 24.1
    vals[4] = 50
    改变后的值
    vals[0] = 10.1
    vals[1] = 20.23  //已更改
    vals[2] = 33.1
    vals[3] = 70.8   //已更改
    vals[4] = 50

    4.总结

      引用比指针使用起来形式上更漂亮,使用引用指向的内容时可以之间用引用变量名,而不像指针一样要使用*;定义引用的时候也不用像指针一样使用&取址。

      在底层,引用变量由指针按照指针常量的方式实现。

    使用引用参数的主要原因有两个:

    • 程序员能修改调用函数中的数据对象
    • 通过传递引用而不是整个数据–对象,可以提高程序的运行速度

     5.什么时候使用引用,什么时候使用指针

    对于数据不做修改的函数:

    • 如果数据对象很小,如内置数据类型或者小型结构,则按照值传递
    • 如果数据对象是数组,则使用指针(唯一的选择),并且指针声明为指向const的指针
    • 如果数据对象是较大的结构,则使用const指针或者引用,已提高程序的效率。这样可以节省结构所需的时间和空间
    • 如果数据对象是类对象,则使用const引用(传递类对象参数的标准方式是按照引用传递)

    对于修改函数中数据的函数:

    • 如果数据是内置数据类型,则使用指针
    • 如果数据对象是数组,则只能使用指针
    • 如果数据对象是结构,则使用引用或者指针
    • 如果数据是类对象,则使用引用
  • 相关阅读:
    CMDB表结构设计
    mysql数据库密码
    web之提取状态码
    ELK的启动脚本
    ELK的轻量级搭建使用
    liunx安装JDK
    liunx的urandom生成随机字符
    vim快捷键
    升级系统的python程序
    Mysql的进阶小记
  • 原文地址:https://www.cnblogs.com/baconZhang/p/13821073.html
Copyright © 2011-2022 走看看