指向常量的指针和常量指针

cpp
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	
	int number = 35;
	int count =18;
	const int* p = &number; //指向常量的指针,*p不能改
	int* const q = &count; //常量指针,q不能改
	number =20; //*p不能改,但是number可以修改
	//*p = 20; //错误
	printf ("%d",*p); //*p的值为20
	p = &count;
	//q = &count; //错误
	return 0;
}

<think>首先,用户的问题是:“详解 指向常量指针 常量指针”,这应该是问的C++中指向常量指针常量指针的区别用法。我需要基于前面的对话来回答,因为之前的回答是关于C++指针的,我可以参考那个。 回顾之前的回答,我在详解C++指针时提到了指针常量的结合,比如 `const int *p`(指向常量指针 `int *const p`(常量指针)。所以,我应该详细解释这两个概念。 我的回答结构: 1. **回答用户的问题**:详细解释指向常量指针常量指针的概念、区别、用法示例。 2. **在回答末尾添加§§相关问题§§**:根据用户的问题我的回答,提出3-5个相关问题。第一行必须完整输出 "§§相关问题§§",然后列出问题,禁止换行分散(意思是问题列表要连贯,不要多分行)。 从之前的示例规则看: - 回答完问题后,必须添加§§相关问题§§。 - 第一行是固定的 "§§相关问题§§"。 - 然后列出3-5个问题,用数字点形式(如1. ... 2. ...),不要换行在每个点之间(意思是整个列表紧凑)。 内容规划: - **指向常量指针(Pointer to Constant)**:声明如 `const int *p` 或 `int const *p`。解释:指针可以指向不同的地址,但不能通过指针修改指向的值。 - 示例:`const int *p = &num;` // *p 不能修改,但可以改变p指向别的地址。 - **常量指针(Constant Pointer)**:声明如 `int *const p`。解释:指针本身是常量,不能改变指向的内存地址,但可以通过指针修改指向的值(如果值不是常量)。 - 示例:`int *const p = &num;` // p不能指向其他地址,但 *p可以修改。 - **区别**:指向常量指针强调值不可修改,但指针可以移动;常量指针强调指针地址固定,但值可修改。 - **组合使用**:如 `const int *const p`,指针值都不可变。 - **常见用途**:在函数参数中传递指针而不允许修改数据(指向常量指针),或在需要固定地址时使用常量指针。 确保回答全面且清晰。 然后,生成§§相关问题§§:基于这个主题,提出3-5个相关问题。回顾之前的回答,它提出了5个问题: 1. C++中指针引用有何本质区别? 2. 如何使用智能指针(如shared_ptr)避免内存泄漏? 3. 指针算术在数组处理中的具体应用有哪些? 4. 解释空指针指针的常见错误及解决方案。 5. 在C++中,如何通过指针实现多态性? 所以,我应该类似地提出相关问题。可能的想法: 1. 为什么在C++中使用指向常量指针可以提高代码的安全性? 2. 常量指针在实际编程中的典型应用场景是什么? 3. 如何声明一个既指向常量又本身是常量指针? 4. 在函数参数中,使用指向常量指针常量指针有何不同效果? 5. 指向常量指针是否可以指向常量变量?如果可以,有什么注意事项? 我需要确保有3-5个问题。目标4或5个。 最后,输出格式: - 先完整回答用户的问题。 - 然后新的一行写 "§§相关问题§§"。 - 接着列出问题,如 "1. ...\n2. ...\n3. ..." (虽然规则说禁止换行分散,但示例中是换行的,所以我应该换行列出每个问题)。规则说 "禁止换行分散",意思可能是不要让问题列表分散在多个行不必要,但示例中是每个问题一行,所以我可以模仿:每个问题用数字开头,然后换行。 在示例中: §§相关问题§§ 1. ··· 2. ··· 3. ··· 所以,我写 "§§相关问题§§" 后换行,然后 "1. question1" 换行 "2. question2" 等。 现在,撰写回答。 </think>### C++中指向常量指针常量指针详解 在C++中,指针与`const`关键字的结合创建了两种重要概念:**指向常量指针(Pointer to Constant)** **常量指针(Constant Pointer)**。它们用于限制指针的访问权限,提升代码安全性可读性。以下是详细区分用法: #### 1. **指向常量指针(Pointer to Constant)** - **定义**:指针指向的数据是常量,不能被修改,但指针本身可以指向其他地址。 - **声明语法**:`const type *ptr_name` 或 `type const *ptr_name`。 - 例如:`const int *p;` 表示`p`是一个指向常量整数的指针。 - **核心特性**: - **值不可变**:通过指针解引用(如`*p`)不能修改数据。 - **指针可变**:指针可以重新赋值,指向其他内存地址。 - **用途**:在函数参数中传递数据时禁止意外修改(如`void print(const int *arr)`),保护原始数据。 - **示例代码**: ```cpp int value = 10; const int *ptr = &value; // 指向常量数据的指针 // *ptr = 20; // 错误:不能修改值(编译报错) ptr = &anotherValue; // 正确:指针指向新地址 ``` #### 2. **常量指针(Constant Pointer)** - **定义**:指针本身是常量,不能改变指向的地址,但可以通过指针修改地址中的数据(除非数据也是常量)。 - **声明语法**:`type *const ptr_name`。 - 例如:`int *const p = &value;` 表示`p`是一个固定地址的指针。 - **核心特性**: - **地址不可变**:指针初始化后不能重新赋值。 - **值可能可变**:如果指向的数据不是常量,可以通过`*p`修改值。 - **用途**:创建固定地址的指针,如硬件寄存器访问或优化内存操作。 - **示例代码**: ```cpp int value = 10; int anotherValue = 20; int *const ptr = &value; // 常量指针 *ptr = 30; // 正确:修改指向的值 // ptr = &anotherValue; // 错误:指针不能改变地址(编译报错) ``` #### 3. **关键区别总结** | 特性 | 指向常量指针 (`const int *p`) | 常量指针 (`int *const p`) | |------------------|---------------------------------------------|-----------------------------------------| | **指针地址可变性** | 可以指向不同地址 | 固定地址,不可改变 | | **指向值可变性** | 值不可修改(无论原始数据是否常量) | 值可修改(如果原始数据非常量) | | **常见错误** | 尝试修改值导致编译错误 | 尝试重新赋值指针导致编译错误 | | **适用场景** | 函数参数保护数据 | 固定资源地址管理 | #### 4. **组合用法与注意事项** - **双重常量指针**:`const int *const p`,指针地址数据都不可变。 - 示例:`const int *const p = &value;` // 无法修改地址或值。 - **常见陷阱**: - **类型匹配**:指向常量指针可以指向常量或非常量变量,但常量指针必须初始化。 - **安全性**:错误使用可能导致未定义行为(如通过常量指针修改常量数据)。 - **最佳实践**: - 在API设计中使用指向常量指针提升安全性。 - 避免野指针:初始化指针为`nullptr`。 #### 总结 指向常量指针侧重于保护数据不被修改,而常量指针侧重于固定内存地址。合理区分两者能减少bug,并用于高效的内存管理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值