【问题标题】:Difference between const. pointer and reference?常量之间的区别。指针和参考?
【发布时间】:2011-01-21 03:06:21
【问题描述】:

常量指针和引用有什么区别?

常量指针顾名思义不能再次绑定。参考文献也是如此。

我想知道在哪种情况下,一种会比另一种更受欢迎。他们的 C++ 标准及其实现有何不同?

干杯

【问题讨论】:

    标签: c++ reference pointers


    【解决方案1】:

    const 指针有 3 种类型:

    //Data that p points to cannot be changed from p
    const char* p = szBuffer;
    
    //p cannot point to something different.  
    char* const p = szBuffer;
    
    //Both of the above restrictions apply on p
    const char* const p = szBuffer;
    

    上面的方法 #2 与参考最相似。

    引用与上述所有 3 种类型的 const 指针之间存在关键区别:

    【讨论】:

    • 另外,引用是对象的别名。这意味着可以在不取消引用的情况下使用引用(请原谅令人困惑的术语)。
    【解决方案2】:

    我假设您的意思是 const 值指针(例如 int* const ptr),而不是指向 const 的指针(例如 int const* ptr)。

    • 不初始化引用是编译错误(避免了未初始化指针的问题)
    • 指针也可以指向一个数组,或者它可以是 NULL,其中一个引用总是指向一个对象。
    • 语法很不一样

    【讨论】:

    • 可以引用一个数组元素:int& intRef(intArray[2]);。指向数组的 const 指针指向数组元素的地址。我不确定你的第二个子弹的数组部分意味着什么。也许您的意思是您可以在指针上使用[] 运算符。
    【解决方案3】:

    何时应该使用每个:

    参考: 默认使用这些。人们取消引用 NULL 指针是很常见的。您可以通过参考消除这种风险。

    常量指针: 当您想要参考,但无法制作时。例如,您正在编写一个驱动程序,并且您想要一个指向内存映射开头的指针。在这种情况下,引用没有多大意义。此外,如果您需要一个数组,引用将不起作用(尽管具有引用成员的简单类数组可以)。

    在下一个示例中,const 指针检查引用无法检查的错误:

    int addFour( int* register ){
      if(isNull(arg)){
        throw NullPointerException();
      }  
    
      // some stuff
      *register += 4;
    
      return register;
    }
    
    // This could be any function that does pointer math.
    bool isNull(const int* ptr){
      return( NULL == ptr );
    }
    

    【讨论】:

      【解决方案4】:

      几乎所有的点都被其他答案所涵盖,除了这个重要的: 可以对指针进行算术运算,但不能对引用进行运算。 例如

      int a[3] = {39, 18, 97};
      int * const b = a;
      int c = *(b+1);  // sets c = 18
      

      【讨论】:

      • @JackDeeth 但我猜指针算法有时很有用。
      【解决方案5】:

      一些区别:

      一个 const 指针可以指向 NULL。

      一个常量点可以指向一个对象数组。

      常量指针可以通过抛弃常量再次绑定。

      【讨论】:

      • 一个指针可以指向一个对象数组的第一个元素......虽然你同样可以拥有一个数组指针类型并且引用这样的类型。
      • 常量转换应该是非常罕见的、有充分理由的、有据可查的。大量铸件与正常功能混在一起通常是设计不佳的症状。
      • 抛弃常量并写入常量变量会导致分段错误,因此这绝对不是一个好主意。许多系统上的常量存储在单独的只读内存区域中,或者它们的值可以直接替换为编译器的计算,从而完全避免读取。
      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多