AI编程助手
AI免费问答

const指针和指针const区别 常量指针与指针常量详解

P粉602998670   2025-08-15 18:54   736浏览 原创

c++++中const与指针结合时,关键在于const的位置:const在左边修饰数据,表示“常量指针”(如const int ptr),指针可变但不能修改所指向的值;const在右边修饰指针本身,表示“指针常量”(如int const ptr),指针不可变但可修改所指向的值;若两边都有const(如const int* const ptr),则指针和数据均不可变,必须在声明时初始化,适用于需要严格保护的场景,理解时可依据“左定值,右定向”口诀快速判断。

const指针和指针const区别 常量指针与指针常量详解

在C++中,

const
关键字与指针结合使用时,容易让人混淆。常见的说法“const指针”和“指针const”其实并不准确,更规范的说法是“常量指针对”和“指针常量”,它们的含义完全不同,取决于
const
修饰的是指针本身,还是指针所指向的数据。

下面我们来详细解释:


一、常量指针(Pointer to const)——“指向常量的指针”

定义:指针可以指向不同的地址,但不能通过该指针修改所指向的数据。

语法形式

const int* ptr;
// 或
int const* ptr;

这两种写法是等价的,都表示“指向常量整数的指针”。

特点

  • 指向的数据是“常量”,不能通过
    ptr
    去修改。
  • 指针本身可以改变,即可以指向其他地址。

示例

int a = 10;
int b = 20;

const int* ptr = &a;
// *ptr = 30;  // 错误!不能通过ptr修改a的值
ptr = &b;       // 正确!ptr可以指向b

关键点

  • const
    *
    的左边,说明数据是常量。
  • 口诀:“左定值,右定向”——
    const
    *
    左边,值不能改。

二、指针常量(const pointer)——“常量指针(注意命名歧义)”

定义:指针本身是一个常量,即指针的指向不能改变,但可以修改它所指向的数据。

语法形式

int* const ptr = &some_variable;

特点

  • 指针一旦初始化,就不能再指向别的地址。
  • 可以通过指针修改它所指向的值。

示例

int a = 10;
int b = 20;

int* const ptr = &a;
*ptr = 30;      // 正确!可以修改a的值
// ptr = &b;   // 错误!ptr不能改变指向

关键点

  • const
    *
    的右边,说明指针本身是常量。
  • 必须在声明时初始化,因为之后不能再赋值。

三、指向常量的常量指针(const pointer to const)

定义:指针本身不能改变,指向的数据也不能通过该指针修改。

语法形式

const int* const ptr = &a;

特点

  • 指针不能重新指向其他变量。
  • 也不能通过指针修改所指向的值。

示例

int a = 10;
int b = 20;

const int* const ptr = &a;
// *ptr = 30;  // 错误!不能修改值
// ptr = &b;   // 错误!不能修改指针指向

适用场景:用于保护数据和指针本身,常用于函数参数中防止误操作。


四、如何快速判断?——看const的位置

记住这个简单规则:

  • const
    *
    左边:数据是常量 → 不能改值。
  • const
    *
    右边:指针是常量 → 不能改指向。
  • 两边都有
    const
    :都不能改。

例子分析

声明 含义
@@######@@ 数据是常量,指针可变(常量指针)
@@######@@ 同上(等价写法)
@@######@@ 指针是常量,数据可变(指针常量)
@@######@@ 数据和指针都是常量

五、常见误区与注意事项

  • “常量指针” vs “指针常量”命名容易混淆

    • “常量指针”指的是指向常量的指针(
      const int* ptr
      ),重点在“指向常量”。
    • “指针常量”指的是指针本身是常量(
      int const* ptr
      ),重点在“指针是常量”。
  • 初始化要求

    • 指针常量(
      int* const ptr
      )必须在定义时初始化,否则编译报错。
  • 函数参数中的使用

    const int* const ptr

基本上就这些。理解的关键是分清

const int*
修饰的是
int* const
后面的类型(数据),还是
int* const ptr
本身(指针变量)。多写几个例子,结合“左定值,右定向”的口诀,很快就能掌握。

void func(const int* ptr);        // 防止函数内修改数据
void func(int* const ptr);        // 指针不能变,但数据可改(较少用)
void func(const int* const ptr);  // 最严格保护
const
*
*
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。