c++ const int 和int 有什么区别,const的作用是什么。【by徐玉丽】

本文解释了C/C++中constint与普通int类型的差异,重点介绍了constint如何作为常量使用,以及它在编译和运行期间的行为。通过比较宏定义和const定义,展示了constint在代码效率上的优势。
    
加上const肯定有别与不加的,不然也不会出现这个定义。
const int类型一旦定义以后就不能修改,int类型是随时可以修改的
在取指针方面,const有略复杂的东西,但是常规的、合理的操作不应该涉及到,因为const int是用来保存一些全局常量的,这些常量在编译期可以改,在运行期不能改,听起来这像宏,其实这确实就是用来取代宏的: #define PI 3.14 const float Pi = 3.14; 如果你的代码里用到了100次 PI(宏),你的代码中会保存100个3.14这个常数,鉴于使用常数进行运算的机器代码很多时候会比使用变量来的长,如果你换用100次Pi(const float),程序编译后的机器码里就不需要出现100次常量3.14,只要在需要的时候引用存有3.14的常量就行了,特别在复杂的运算里,3.14这个常量(其实是无法修改的变量)会被一直装载在寄存器里带来一些性能提升。 清楚了const的用法,const int和int的区别就很简单,int i里的i可以被更改,是真正的变量,const int i的i不可以被更改,是有着变量外衣的常数。
<think> 嗯,用户这次的问题是关于C++中两种指针写法的区别int const *p const int *p。从对话历史看,用户之前已经了解过指针的基础概念,现在开始关注const修饰符在指针中的具体用法。 用户可能正在学习C++的内存管理常量修饰,或者在实际编码中遇到了相关困惑。ta特意提到了站内的三个引用资料,说明ta已经做过一些研究,但需要更清晰的解释。尤其引用[3]明确指出“const int*int const*相同”,但用户还是专门提问两者的区别,说明ta对理论解释存在疑虑。 我注意到用户引用的资料其实已经给出了答案(引用[1][3]都声明两者等价),但需要更落地的验证。考虑设计三个层次的解释: 第一层用最直白的语言确认两者完全等价,避免用户继续纠结; 第二层通过具体代码展示两种写法在赋值解引用时的相同行为; 第三层则解释为什么C++允许这两种写法并存(历史兼容性程序员习惯)。 用户似乎容易混淆“指针常量”“常量指针”的概念,这在引用[2]中也有体现。准备在代码示例里特意加入修改指针地址修改值的对比操作,比如: - 允许p = &b(改变指针指向) - 禁止*p = 20(保护指向的数据) 这样能直观体现“指向常量的指针”的核心特征。 最后两段需要强调注意事项:虽然语法等价,但团队协作时建议统一风格。这点用户可能没想到,但实际开发中很重要——毕竟混用两种写法会导致代码可读性下降。 </think>在 C++ 中,`int const *p` `const int *p` **完全等价**,两者都表示 **指向常量整数的指针(Pointer to Constant Integer)**。以下是详细分析: --- ### 核心区别:无实质差异 1. **语法等价性** - **`const int *p`**:`const` 修饰 `int`,表示指向的数据是常量。 - **`int const *p`**:`const` 修饰 `int`,含义同上。 **两者在编译器眼中完全一致**,区别仅在于 `const` `int` 的书写顺序[^1][^3]。 2. **共同特性** - ✅ **指针本身可变**:可重新指向其他内存地址。 - ❌ **指向的数据不可变**:禁止通过指针修改其指向的值。 ```cpp int a = 10, b = 20; const int *p1 = &a; // 或 int const *p1 = &a; p1 = &b; // ✅ 合法:改变指针指向 *p1 = 30; // ❌ 错误:禁止修改指向的值 ``` --- ### `int *const p` 的对比 需注意 **常量指针(Constant Pointer)** 的区别: ```cpp int a = 10; int *const p2 = &a; // p2 是常量指针 *p2 = 20; // ✅ 合法:可修改指向的值 p2 = nullptr; // ❌ 错误:禁止改变指针指向的地址 ``` - **`int *const p`**:`const` 修饰指针 `p`,表示指针地址不可变,但指向的数据可变[^2]。 --- ### 关键总结 | 类型 | 含义 | 指针是否可变 | 指向数据是否可变 | |--------------------|--------------------------|--------------|------------------| | `const int *p` | 指向常量整数的指针 | ✅ | ❌ | | `int const *p` | 同上(完全等价) | ✅ | ❌ | | `int *const p` | 常量指针(地址不可变) | ❌ | ✅ | > 💡**编码建议**:团队协作中建议统一使用 `const int *p` 形式,可读性更高。 --- ### 代码验证 ```cpp #include <iostream> using namespace std; int main() { int a = 10, b = 20; // 验证 const int* int const* 等价 const int *p1 = &a; int const *p2 = &a; p1 = &b; // ✅ 两者均可改变指向 p2 = &b; // *p1 = 30; // ❌ 两者均报错:修改常量数据 // 对比 int* const int *const p3 = &a; *p3 = 30; // ✅ 可修改数据 // p3 = &b; // ❌ 报错:指针地址不可变 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值