C语言中常量指针与指针常量的区别详解

苏见山
苏见山
发布时间:2026-10-13 | 3人浏览过
原创

在C/C++开发中,const关键字与指针结合使用时,极易因定义顺序不同导致逻辑混淆。本文针对初学者解析三种核心组合:常量指针(地址固定,内容可变)、指针常量(地址可变,内容只读)以及指向常量的常量指针。通过具体的编译错误示例和运行结果,明确各自的使用场景与限制。

常量指针:地址不可变

常量指针(Pointer to Constant Variable,但在定义语法上体现为* const)是指针本身是一个常量。这意味着一旦初始化完成,该指针变量所存储的地址就不能再修改,但它所指向内存中的数据内容是可以修改的。

第1步:声明与语法结构

常量指针的定义遵循“类型 * 名称”的基础,只需在星号后添加const即可:

<type> * const <pointer_name>

示例:

int * const ptr;

第2步:操作限制验证

由于指针本身是常量,因此尝试修改其指向地址会引发编译错误。但可以通过该指针修改变量的值。

如图所示,当尝试执行 ptr = &var2 时,编译器会提示错误,因为不能给常量指针重新赋值。但只要不移动指针地址,对 *ptr 的写操作是被允许的。

指针常量:内容不可变

指针常量实际上在术语上更常被称为“指向常量的指针”。它允许指针指向不同的地址,但禁止通过该指针修改目标地址处的数据内容。这通常用于保护传入函数的参数不被意外修改。

第1步:声明与语法结构

将const放在星号之前即可实现:

const <type> * <pointer_name>
// 或者等价写法
<type> const * <pointer_name>

示例:

const int *ptr;

第2步:操作限制验证

此时ptr可以指向其他变量,但试图通过解引用修改内容(如 *ptr = 2)将遭到编译器拒绝。

编译失败信息表明 *ptr 具有只读属性。这确保了数据的完整性,常用于函数形参声明以增强安全性。

指向常量的常量指针

这是上述两种情况的混合形态:const 既出现在星号前,也出现在星号后。使用这种定义的指针,既不能修改其指向的地址,也不能修改指向的内容。

const <type> * const <pointer_name>

示例:

const int * const ptr;

在此模式下,任何针对 ptr 的赋值操作(改地址)或对 *ptr 的赋值操作(改内容)都会导致编译错误。

核心区别与快速记忆法

为了直观区分这两种容易混淆的概念,我们可以通过一个对比实验来观察实际效果。

int a = 3; 
int b = 1; 
int c = 2; 

// const在前,指向常量的指针(可改地址,不可改内容)
int const *p1 = &b; 

// *在前,常量指针(不可改地址,可改内容)
int *const p2 = &c;

对于 p1:

  • p1 = &a 是正确的,因为它只是改变了地址。
  • *p1 = a 是错误的,因为内容受const保护。

对于 p2:

  • p2 = &a 是错误的,因为指针本身是常量。
  • *p2 = a 是正确的,只要地址不变,可以随时修改其指向的值。

调试过程中的典型错误

在Vim编辑器中进行调试时,如果不小心违反了上述规则,编译器会给出明确报错。

例如取消注释违反常量指针规则的代码行时,GCC等编译器会在对应行号标记出 “assignment of read-only location” 或 “read-only variable is not assignable” 等错误。

只有修正了这些违反约束的操作,程序才能成功编译并输出预期结果。

从正确运行的结果可以看出:

  1. 对于常量指针 p1,当其地址发生改变时,打印出的内容也会随之变化,证明其内容读取能力未受损。
  2. 对于指针常量 p2,初始化后地址锁定,后续对 *p2 的赋值能直接生效且保留至最终输出。

进一步验证:内容只读的限制

如果我们再次尝试修改 p1 指向的内容:

编译器明确指出无法对只读位置进行赋值。反之,若尝试修改 p2 的地址:

同样会被拦截,提示常量指针不可重定向。经过以上多层级的测试与观察,常量指针与指针常量的本质区别便清晰可见。

总结

掌握指针常量的关键在于看 const 关键字的位置。有一个简单的口诀可以帮助记忆:“const 在哪侧,哪侧就恒定”。具体而言:

const 在 * 前面,表示指向的内容是常量;
const 在 * 后面,表示指针本身是常量;
两者皆有,则内容与地址均不可变。

这种机制在嵌入式开发和系统级编程中尤为重要,它能从编译阶段防止意外的数据篡改。以上就是C语言中详解常量指针和指针常量的详细内容,更多关于C/C++基础教程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表