常量指针和引用有什么区别?
常量指针不能再次绑定,与之类似的是引用。
我想知道在什么场景下会优先选择其中之一。它们在C++标准和实现方面有多大的差异?
谢谢。
有三种类型的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;
上面的第二种方法最类似于引用。
引用和上述3种const指针之间存在重大差异:
const指针可以为NULL。
引用没有自己的地址,而指针有。
引用的地址是实际对象的地址。
指针有自己的地址,并且它将指向值的地址作为其值保存。
何时使用每个选项:
引用(reference):默认情况下使用。人们很容易对空指针进行解引用,使用引用可以避免这种风险。
常量指针(const pointer):当您想要引用但无法创建引用时使用。例如,您正在编写驱动程序,并且希望获得一个指向内存映射开头的指针。在这种情况下,引用没有那么多意义。此外,如果需要一组元素,则无法使用引用(但是具有引用成员的简单类数组可以)。
在下一个示例中,常量指针检查了引用无法检查的错误:
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* const ptr),而不是指向常量的指针 (例如 int const* ptr)。
int& intRef(intArray[2]);
。指向数组的const指针指向数组元素的地址。我不确定你第二个要点中的数组部分有多重要。也许你的意思是可以在指针上使用[]
运算符。 - thebretnessint a[3] = {39, 18, 97};
int * const b = a;
int c = *(b+1); // sets c = 18
一些不同之处:
const指针可以指向NULL。
const指针可以指向对象数组。
通过去除const属性,const指针可以再次绑定。