第5.10章: const 与指针

English

概述

指针与 const 的交互有三种不同的方式。理解 这些组合对于编写正确且安全的 C++ 代码至关重要。

在本章中,你将学到:

1. 规则:const 作用于左边。就这样。

这条规则在第2.8章中介绍过,也是解读所有 const 指针类型的基础:

如果 const 左边有类型,它就作用于该类型。 如果没有,它就作用于右边。

示例:


int const x = 5;   // const applies to int
const int y = 6;   // same meaning, but less clear

对指针而言,这条规则变得极其重要。

2. 指向 const 的指针:T const*

这表示“指向 const T 的指针”。 指针可以改变,但它所指的对象不可以。


int value{10};

int const *p = ::std::addressof(value);   // pointer to const int

允许:


p = ::std::addressof(value);   // ✔ pointer may change

不允许:


// *p = 20;   // ❌ cannot modify through pointer

这是指向 C 风格字符串的指针的正确类型:


char const *s = "Hello";   // correct

请始终写 T const*,而不是 const T*。

3. const 指针:T* const

这表示“指向 T 的 const 指针”。 指针不可以改变,但它所指的对象可以。


int value{10};

int * const p = ::std::addressof(value);   // const pointer

允许:


*p = 20;   // ✔ can modify the pointee

不允许:


// p = nullptr;   // ❌ pointer itself is const

4. 指向 const 的 const 指针:T const* const

这表示:


int value{10};

int const * const p = ::std::addressof(value);

不允许:


// p = nullptr;   // ❌ pointer is const
// *p = 20;       // ❌ pointee is const

5. 为什么 char const* 是 C 风格字符串的正确类型

字符串字面量是常量 C 风格数组。 它不能被修改。


char const *s = "Hello";   // correct

写 char const* 让 const 性明确,并遵循规则:

const 作用于左边。就这样。

写 const char* 是允许的,但与该规则不太一致。

6. const 与指针算术

const 不影响指针算术。 它只影响什么可以被修改。


int a[3]{1,2,3};

int const *p = a;   // pointer to const int
p = p + 1;          // ✔ pointer may move

但你仍然不能修改所指对象:


// *p = 10;   // ❌ not allowed

对 const 指针而言:


int * const q = a;   // const pointer
// q = q + 1;        // ❌ cannot move pointer
*q = 10;             // ✔ can modify pointee

7. 汇总表

语法 含义 指针可以改变? 所指对象可以改变?
T const* 指向 const T 的指针 ✔ 可以 ❌ 不可以
T* const 指向 T 的 const 指针 ❌ 不可以 ✔ 可以
T const* const 指向 const T 的 const 指针 ❌ 不可以 ❌ 不可以

要点