c++指针(四)——指针常量和常量指针

本文详细解析了C++中的常量定义与使用、指针常量及常量指针的区别,通过实例展示了如何正确地应用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)、常量的定义,const的使用

int const a=10;//定义一个int型的常量a,以后不能修改a的值
const int b=20;//定义一个int型的常量b,以后不能修改b的值

const 和 int 的位置可以互换,都表达的是相同的意思。

以下是不正确的定义

const int c;//错误,系统不会对c进行初始化为0,所以此语句没有对 c 进行初始化,不正确
const int d;//错误,没有进行初始化
d=8;//错误,对d进行了修改

总结:在const定义一个常量的时候同时要对其初始化


(2)、指针常量和常量指针

指针常量和常量指针的概念:(对于概念我很多时候傻傻分不清,只要能通过代码认清楚就好了)

首先它两都是定义了一个指针,其次指针常量指的是指针本身是常量,常量指针是被指向的对象是常量

那么定义一个常量指针(下边四条语句都是正确的定义)

const int * p1;//定义一个常量指针,系统为其指向的int型对象初始化
int const * p1;//同上
const int *p1=array;//定义一个常量指针,为其初始化为array
int const *p1=array;//定义一个常量指针,为其初始化为array

定义一个指针常量

int * const p2;//定义出错,
int * const p2=array;//定义成功

那么指针常量和常量指针的区别在哪里呢?我们做下面一个测试

int a1=10;
int a2=20;
const int * p=&a1;//定义一个常量指针,并给指针p赋值
p=&a2;//改变指针p的值,正确
*p=a2;//错误,不能为指针p指向的内容赋新值

在上边一段代码中 const int * p=&a1; 这条语句定义了一个指针 p ,我们知道const int * p=&a1; 和int const * p=&a1; 是等价的,  我们把const int看成一个整体 ci ,那么 ci 就是*p 的类型,也就是 *p 的类型是 “被const修饰过的int类型”,所以 *p 是不能改变的,const 修饰的不是 p ,所以 p 是可以修改的

我们继续做一个测试

int a1=10;
int a2=20;
int * const p=&a1;
*p=30;
p=&a2;
此时const直接修饰的是 p ,因此 p 的值不能改,*p 的值可以修改~~~

那我们定义这样一个指针p呢?

const int * const p=&a1;

p 和 *p 都不能修改~~~

那下边这条最简单的语句

int * p;

p 和 *p 都是可以修改的~~~


const就讲到这里,继续下一篇,指针的指针


### C++常量指针指针常量的区别及使用场景 #### 1. 常量指针(Pointer to Constant) - **定义**:常量指针是指向常量数据的指针,意味着通过该指针无法修改其所指向的数据内容[^2]。这种情况下,指针本身是可以变化的,但它始终指向一个不可变的对象。 - **声明形式**:`const int* ptr;` 或者 `int const* ptr;` 表示 `ptr` 是一个指向常量整数的指针。 ```cpp #include <iostream> using namespace std; int main() { const int a = 10; const int* ptr = &a; // 指向常量指针 // *ptr = 20; // 错误:不能通过此指针修改指向的内容 cout << "*ptr: " << *ptr << endl; // 可以读取指向的内容 } ``` #### 2. 指针常量Constant Pointer) - **定义**:指针常量表示指针本身的值是固定的,在初始化之后不能再指向其他的地址[^3]。然而,它所指向的数据内容是可以被修改的(除非另外加上了 `const` 关键字)。 - **声明形式**:`int* const ptr = &var;` 表示 `ptr` 的值在初始化后固定不变。 ```cpp #include <iostream> using namespace std; int main() { int a = 10, b = 20; int* const ptr = &a; // 指针常量 *ptr = 30; // 正确:可以修改指向的内容 cout << "*ptr after change: " << *ptr << endl; // ptr = &b; // 错误:指针常量的值不能改变 } ``` #### 3. 组合情况 —— 常量指针常量Constant Pointer to Constant) - 还有一种更严格的组合形式,称为常量指针常量,即指针本身以及它所指向的数据都是不可变的[^4]。 - **声明形式**:`const int* const ptr = &a;` ```cpp #include <iostream> using namespace std; int main() { const int a = 10; const int* const ptr = &a; // 常量指针常量 // *ptr = 20; // 错误:不能修改指向的内容 // ptr = &another_var; // 错误:指针自身的值也不能改变 } ``` --- #### 使用场景分析 ##### (1) 常量指针的应用场景 - 当需要保护某些数据不被意外修改时,应该采用常量指针的形式。这通常发生在函数间传递参数或者实现接口设计的时候,确保外部调用不会篡改内部敏感数据[^1]。 ##### (2) 指针常量的应用场景 - 若程序逻辑中有一处特定位置总是需要用到同一个资源,则可以用指针常量来锁定这个连接关系,从而减少因频繁重新赋值而导致的潜在错误风险。 ##### (3) 常量指针常量的应用场景 - 在一些特殊需求下,比如配置文件加载器或硬件寄存器映射等领域,可能要求既定地址上的数值在整个运行周期内都维持稳定状态,此时就可以利用这一特性构建安全可靠的编程模型[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值