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

陈默
陈默
发布时间:2026-10-16 | 2人浏览过
原创

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步:完整实战对比程序

目的**:在一个程序中直观展示四种指针类型的不同行为。

入口**:编写测试函数并打印内存变化。

动作步骤**:

  1. 创建普通整型变量 `a` 和常量整型变量 `b`。
  2. 实例化四种指针并分别尝试修改其指向和内容。

运行状态与输出截图:以下为实际运行时的内存快照与数据对比,展示了修改前后的数值变化。

第4步:排错指南(常见问题排查)

真实操作顺序:

  • 错误现象 1**:`assignment of read-only location`。

    **原因**试图给定义为 const int * 的指针直接赋值新值(如 `q = &c` 时编译器报错了?不,这是对的。是指 `错误现象 2:`invalid conversion from 'const int*' to 'int*'`。

    **原因**试图将指向常量的指针赋给普通指针。由于普通指针可能修改值,而原值是只读的,这种转换会破坏常量性。

以上就是C语言中指针常量和常量指针的详细解析,更多关于C语言指针用法及进阶资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表