C语言指针常量与常量指针区别详解
C语言面试中常问指针常量与常量指针的区别:指针常量是固定不变的“路标”,指向的地址锁定但内容可改;常量指针是只读的“相机”,可查看或改变观察对象但拍摄内容不可变。核心差异在于 const 修饰符相对于星号的位置。
核心概念与声明语法
在 C/C++ 中,区分两者的关键在于看 const 修饰的是谁。它放在指针变量名的左侧还是右侧:
- 指针常量 (Pointer to Constant Variable):
数据类型 * const 变量名。const位于星号右侧,修饰指针本身。 - 常量指针 (Constant Pointer):
数据类型 const * 变量名或const 数据类型 *变量名。const位于星号左侧,修饰指针指向的值。 - 常量指针常量:
const 数据类型 * const 变量名。
第1步:理解指针常量 (int *const)
目的**:理解如何将一个指针的指向固定下来,使其成为地址常量。
规则说明:将 const 写在指针操作符的右侧。这意味着指针变量自身保存的地址不能被修改,但该地址存储的内容可以被改写。
代码演示与结果分析:
int a = 10; // 定义一个指针常量 p,初始指向 a int *const p = &a; // 编译报错:无法给常量赋值 // p = &b; // 正确:可以通过解引用修改 a 的值 *p = 50; // 此时 a 变为 50
第2步:理解常量指针 (const int *)
目的**:确保通过指针访问的数据不被意外修改。
规则说明:const 紧跟在数据类型后。这限制了通过该指针进行的写入操作,但不限制指针自身的移动。
代码演示与结果分析:
int b = 20; // 定义一个常量指针 q const int *q = &a; // 正确:可以修改 q 的指向 q = &b; // q 现在指向 b // 编译报错:不能通过常量指针修改值 // *q = 60;
第3步:完整实战对比程序
目的**:在一个程序中直观展示四种指针类型的不同行为。
入口**:编写测试函数并打印内存变化。
动作步骤**:
- 创建普通整型变量 `a` 和常量整型变量 `b`。
- 实例化四种指针并分别尝试修改其指向和内容。
运行状态与输出截图:以下为实际运行时的内存快照与数据对比,展示了修改前后的数值变化。
第4步:排错指南(常见问题排查)
真实操作顺序:
- 错误现象 1**:`assignment of read-only location`。
**原因**试图给定义为
const int *的指针直接赋值新值(如 `q = &c` 时编译器报错了?不,这是对的。是指 `错误现象 2:`invalid conversion from 'const int*' to 'int*'`。**原因**试图将指向常量的指针赋给普通指针。由于普通指针可能修改值,而原值是只读的,这种转换会破坏常量性。
以上就是C语言中指针常量和常量指针的详细解析,更多关于C语言指针用法及进阶资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













