C++中常指针与指针常量的区别及正确用法
在C++编程中,const关键字与指针结合时容易产生混淆。核心在于区分“指向常量的指针”(常指针)和“常量指针”(指针常量)。常指针旨在保护数据不被修改,而指针常量旨在保护地址不被重定向。理解两者的定义语法、使用限制及编译器行为,是编写安全C++代码的关键。
常指针:指向常量的指针
常指针(Pointer to Constant),即指向常量(或只读区域)的指针。其核心特征是禁止通过该指针修改变量所指向的值。由于它保护的是数据内容,因此它可以指向常变量,也可以指向普通变量(但在访问普通变量时依然受限于只读属性)。
第1步:用常指针指向常变量
目的:验证常指针在指向const定义变量时的合法性和安全性。
入口:定义一个整型常变量和一个整型常指针。
动作:将常变量的地址赋给常指针,并输出指针解引用的值。
关键参数:声明格式为 const 类型名 * 常指针名;。
#include<iostream>
using namespace std;
int main()
{
const int i=5;//定义一个int型常变量
const int *p;//定义一个int型常指针
p=&i;//用常指针指向常变量
cout<<*p<<endl;
return 0;
}
编译运行结果如下:
注意:如果使用普通指针指向常变量,编译器会拒绝编译,因为普通指针存在修改常量的风险。
第2步:用常指针指向一般变量
目的:展示常指针指向非const变量时的特性——可以通过原变量名修改值,但无法通过指针修改。
入口:定义普通整型变量和常指针。
动作:指向后尝试通过指针赋值,以及通过原变量名赋值。
#include<iostream>
using namespace std;
int main()
{
int i=5;//定义一个一般变量
const int *p;//定义了一个常指针
p=&i;//使用常指针指向一般变量
cout<<*p<<endl;
i=10;//通过一般变量的变量名来修改值
cout<<*p<<endl;
return 0;
}
运行结果确认数值随原变量名修改而更新:
如果尝试解除引用来修改值:
*p=10;
这将触发编译错误,阻止了通过指针意外修改数据的风险:
小结:常指针(const type* p)可以指向常变量和一般变量,但都不能通过指针本身来更改它所指向的变量的值。这就像你阅读一份保密文件,你可以看(读取),但不能在上面涂改(写入)。
指针常量:指针本身就是常量
指针常量(Constant Pointer),是指针变量本身被定义为const。其核心特征是指针的指向(地址)一旦确定就不能改变,但它所指向的数据内容是否可变,取决于数据类型本身是否为const。
根据C++规则,只有常指针才可以指向常变量,所以指针常量只可以指向一般变量。且由于其自身是常变量,必须在定义时进行初始化。
第1步:定义并初始化指针常量
目的:创建一个地址固定不变的指针。
入口:定义普通整型变量和指针常量。
动作:初始化指针常量,并通过它修改变量的值。
#include<iostream>
using namespace std;
int main()
{
int i=5;//定义一个一般变量
int * const p=&i;//定义了一个指针常量
cout<<*p<<endl;
*p=30;//通过指针来改变指向的变量的值
cout<<*p<<endl;
return 0;
}
编译运行结果:
排错提示:如果你尝试重新赋予地址 p = &j;,编译器会报错,因为指针常量不可变性意味着“指哪打哪,绝不换枪”。如果你试图让指针常量指向常变量,由于只能由常指针指向常变量,同样会引发类型不匹配警告或错误。
快速辨别技巧与总结
- 看位置:如果
const位于星号*左侧(如const int *p),它是常指针(修饰指针指向的内容);如果const位于星号*右侧(如int * const p),它是指针常量(修饰指针本身)。 - 口诀记忆:“左定值,右定位”。左边(
const*)限制数据的读写,右边(*const)限制地址的更改。
以上就是关于C++中常指针与指针常量详细解析的详细内容,更多关于C++ const指针用法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













