常量指针和引用有什么区别?
顾名思义的常量指针不能再绑定。参考的情况也是如此。
我想知道哪种情况比另一种情况更受欢迎。他们的C ++标准及其实现有何不同?
欢呼声
答案 0 :(得分:48)
有三种类型的const指针:
//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指针之间存在关键差异:
Const指针可以为NULL。
引用没有自己的地址,而指针则没有 引用的地址是实际对象的地址。
指针有自己的地址,它将值指向的值的地址保存为其值。
请参阅my answer here for much more differences between references and pointers。
答案 1 :(得分:6)
我假设你的意思是一个const值指针(例如int * const ptr),而不是指向const的指针(例如int const * ptr)。
答案 2 :(得分:6)
何时应该使用每个:
<强>参考强>: 默认使用这些。人们通常取消引用NULL指针是很常见的。您可以通过参考来消除这种风险。
const指针: 当你想要一个参考,但不能一个。例如,您正在编写驱动程序,并且您想要一个指向内存映射开头的指针。在这种情况下,引用并没有那么多意义。此外,如果你需要一个数组的东西,引用将不起作用(虽然一组简单的类与引用成员将)。
在下一个示例中,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 );
}
答案 3 :(得分:2)
除了这个重要的答案之外,其他答案几乎涵盖了所有要点: 可以对指针进行算术运算,但不能参考。 E.g。
int a[3] = {39, 18, 97};
int * const b = a;
int c = *(b+1); // sets c = 18
答案 4 :(得分:0)
一些差异:
const指针可以指向NULL。
const点可以指向一个对象数组。
通过丢弃constness,可以再次绑定const指针 。