面试题:常量指针和指针常量?
在 C++ 中,常量指针(const pointer)和指针常量(pointer to const)是指针变量的两种变形。它们各自具有不同的特点和应用场景。
常量指针
常量指针是指针指向一个常量值,因此无法通过该指针修改所指对象的值。
以下是一个简单的例子:
int x = 10; const int *p = &x; *p = 20; // 错误,不能通过常量指针修改所指对象的值 x = 20; // 正确,可以直接修改 x 的值
上面的代码中,p 是一个常量指针,它指向一个整型常量 x。由于 p 是常量指针,无法通过 *p 修改所指对象的值。但是可以直接修改 x 的值。
指针常量
指针常量是指针本身是一个常量,因此它无法再指向其它对象,但是可以通过指针间接访问所指对象,并修改其值或地址。
以下是一个简单的例子:
int x = 10; int *const p = &x; *p = 20; // 正确,可以通过指针修改所指对象的值 int y = 30; p = &y; // 错误,无法重新赋值指针常量p的值
上面的代码中,p 是一个指针常量,它指向整型变量 x。由于 p 是指针常量,无法通过重新赋值来访问其它对象,但是可以通过 *p 修改所指对象的值或地址。
常量指针和指针常量的应用场景
常量指针通常适用于指针指向一个不可被修改的常量(如只读内存、只读寄存器等)的情况。另外,常量指针也适用于需传入函数作为参数、但是不想改变函数内部数据的情况。
指针常量通常适用于声明一个永远不会变的指针,且希望其他人清楚地了解该指针不会发生变化,并且希望通过该指针改变所指对象的值或地址的情况。
总结
在 C++ 中,常量指针和指针常量分别代表了两种指针变形形式。常量指针是指针指向一个常量值,不允许通过该指针修改所指对象的值;而指针常量是指针本身是一个常量,无法再指向其它对象,但是可以通过指针间接访问所指对象,并修改其值或地址。在实际开发中,需要根据具体问题和应用场景来选择合适的指针类型来解决问题。