【发布时间】:2011-01-21 03:06:21
【问题描述】:
常量指针和引用有什么区别?
常量指针顾名思义不能再次绑定。参考文献也是如此。
我想知道在哪种情况下,一种会比另一种更受欢迎。他们的 C++ 标准及其实现有何不同?
干杯
【问题讨论】:
常量指针和引用有什么区别?
常量指针顾名思义不能再次绑定。参考文献也是如此。
我想知道在哪种情况下,一种会比另一种更受欢迎。他们的 C++ 标准及其实现有何不同?
干杯
【问题讨论】:
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 指针之间存在关键区别:
常量指针可以为 NULL。
引用没有自己的地址,而指针有。
引用的地址是实际对象的地址。
指针有自己的地址,它的值就是它所指向的值的地址。
见my answer here for much more differences between references and pointers。
【讨论】:
我假设您的意思是 const 值指针(例如 int* const ptr),而不是指向 const 的指针(例如 int const* ptr)。
【讨论】:
int& intRef(intArray[2]);。指向数组的 const 指针指向数组元素的地址。我不确定你的第二个子弹的数组部分意味着什么。也许您的意思是您可以在指针上使用[] 运算符。
何时应该使用每个:
参考: 默认使用这些。人们取消引用 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 );
}
【讨论】:
几乎所有的点都被其他答案所涵盖,除了这个重要的: 可以对指针进行算术运算,但不能对引用进行运算。 例如
int a[3] = {39, 18, 97};
int * const b = a;
int c = *(b+1); // sets c = 18
【讨论】:
一些区别:
一个 const 指针可以指向 NULL。
一个常量点可以指向一个对象数组。
常量指针可以通过抛弃常量再次绑定。
【讨论】: