C/C++ const和指针记忆口诀

本文介绍了C/C++中const关键字与指针的结合使用,通过一句记忆口诀帮助理解它们的关系。const可以放在星号*的前后,分别修饰指针变量和指针所指的值。例如,const int *p不允许通过指针修改指向的数值,而int* const p则禁止改变指针本身的值。同时讨论了多个const的情况以及其对赋值操作的影响。

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

一句话,’*‘和变量名p,是一对情感松散的情侣,只要const卡在’*'和p中间,const就能成为第三者,和p在一起.否则,const都是路人.
如 : int *p, int* p,都可以
角色:int(透明人=空气),*(男人),p(女人), 注:*和p是情侣
const:厉害了,就是身边人,可以是路人,可以是第三者,可以零个,一个,两个
1)const int *p -> const 是路人甲,const修饰*p,*p = 2不可用
2)int const *p -> const 同1)
3)int* const p,const 成功拆散这对情侣,const修饰p,p = &b不可用
4)int const * const p 两个const,给脸了,p脚踏两船, p和const在一起,*和p继续在一起的,p = &b不可用,*p = 2也不可用.
5)const int* const p 同4)

int const *p;
const 修饰*p,不可通过指针修改指向的空间*p,*p = 2,是错误的,但是可以改变指向,如p = &b;

const int *p;
const 修饰*p,不可通过指针修改指向的空间*p

int* const p = &a;
const 只能修饰p,无法修饰到*p,即指针指向不可变,但是可以通过*p修改指向空间的内容,如*p = 2;, 此时a的值发生改变,但是不能p = &b;改变指向

const int* const p = &a;
第一个const 修饰p,第二个const修饰p,此时,不能修改p的指向,也不能通过p来修改指向的空间

	int a = 10,b = 20;

	const int* p = &a; // 指向可变,指针不可修改指向的空间
	// *p = 
<think>好的,我现在要解释指针常量常量指针的区别,这两个概念容易混淆,所以需要仔细理清楚。首先,我得回忆一下C/C++中的相关知识点。指针常量,英文可能是pointer constant,而常量指针可能是constant pointer?或者反过来?有时候中文翻译可能让人混淆,所以最好从语法定义入手。 我记得指针本身是一个变量,它存储的是另一个变量的地址。而常量则是指不可改变的值。那么指针常量常量指针的区别应该在于指针本身是否是常量,或者指针所指向的数据是否是常量。 先考虑指针常量,也就是指针本身是一个常量。这种情况下,指针的指向不能被修改,但指向的值可以改变。语法上应该是这样的:int *const ptr; 这里const修饰的是ptr,所以ptr本身的值(即存储的地址)不能变,但*ptr可以修改。 然后是常量指针,应该是指向常量的指针。也就是说,指针指向的数据是常量,不能通过这个指针修改,但指针本身可以指向别的地址。语法上可能是const int *ptr; 或者int const *ptr;,这里的const修饰的是int,所以*ptr是只读的,但ptr可以改变指向。 但有时候可能会有不同的叫法,比如有人可能把指针常量叫做常量指针,这容易搞混。所以需要确定正确的术语对应。比如在C++ Primer里,可能提到顶层const底层const的概念。顶层const表示指针本身是常量,底层const表示指针指向的对象是常量。 所以总结一下: - 指针常量:指针本身是常量,不能改变指向,但可以改变指向的值。写法是int *const p。 - 常量指针:指向常量的指针,不能通过指针改变值,但可以改变指向。写法是const int *p或int const *p。 为了验证是否正确,可以举个例子。比如指针常量: int a = 10; int b = 20; int *const ptr = &a; ptr = &b; // 错误,不能修改指针的指向 *ptr = 30; // 正确,可以修改a的值 而常量指针的情况: const int *ptr; int c = 5; ptr = &c; // 正确,可以改变指向 *ptr = 10; // 错误,不能通过ptr修改c的值 或者另一种写法: int const *ptr = &c; 这样看来,确实是这样的区分。但有时候用户可能会混淆这两个术语,所以需要明确说明它们的区别,即指针本身是常量还是指向的数据是常量。 另外,可以结合英文术语来帮助记忆指针常量(Pointer Constant)中的“常量”修饰的是指针变量,所以指针不可变。而常量指针(Pointer to Constant)中的“常量”修饰的是指向的数据,因此数据不可变。 还有一个助记的方法:从右往左读声明。比如int *const p,读作“p是一个const指针,指向int”,即指针是常量。而const int *p读作“p是一个指针,指向const int”,即指向的是常量。 再检查一下是否有其他可能性。例如,是否还有指向常量的指针常量?即const int *const p,这时候指针本身指向的数据都不能修改。 总结起来,关键点在于const的位置,以及它修饰的是指针本身还是指针所指向的数据。通过语法示例来明确两者的区别,这样用户就能更好地区分它们了。</think>指针常量常量指针的区别主要在于`const`关键字修饰的对象不同,可以通过以下方式区分: 1. **指针常量(Pointer Constant)** - 特征:`const`修饰指针变量本身 - 声明形式:`int *const ptr` - 特点: - 指针的指向不可改变(像固定座位的考生) - 可以通过指针修改指向的值 - 示例: ```cpp int a = 10, b = 20; int *const p = &a; *p = 30; // ✅ 允许修改值 p = &b; // ❌ 错误!不能修改指针指向 ``` 2. **常量指针(Pointer to Constant)** - 特征:`const`修饰指针指向的数据 - 声明形式:`const int *ptr` 或 `int const *ptr` - 特点: - 指针的指向可以改变(像流动监考老师) - 不能通过指针修改指向的值 - 示例: ```cpp const int c = 5; const int *p = &c; int d = 8; p = &d; // ✅ 允许改变指向 *p = 10; // ❌ 错误!不能修改值 ``` 🔑 **记忆口诀**: 看`const`右边最近的元素 - 右边是`*` → 常量指针(修饰数据) - 右边是变量名 → 指针常量(修饰指针) 💡 组合形态: `const int *const p` 表示指针指向的数据都不可修改(双常量)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值