sharkie's inn

Back

在 C/C++ 中,我们经常会看到 const,但是如果它和指针一起出现,我们老是会弄混,其实只需要看 const 的位置就知道 const 到底在修饰谁了。

Simplest Example#

const int v = 10;                   // 这是修饰 v,表示 v 的值不可变
c

Confusing Example#

const int *p;
int * const p;
c

一个在 *p 的前面,一个直接在 p 的前面。

说明 const int *p 是修饰 *p 的,表明 *p 是不可变的,即 p 所指向的值是不可变的。由此我们可以推出,它等同于 int const *p,都是修饰 *p 的。

同理 int * const p 是修饰 p 的,表明 p 是不可变的,即 p 本身不能变。

More Confusing Example I#

const int *a[10];
int * const a[10];
c

首先数组 a 里面装的都是指针。

const int *a[10] 修饰 a 里面的每个指针所指向的值是不可变的。即你不能对 *a[i] 进行赋值。同理,它等同于 int const *a[10]

int * const a[10] 修饰 a 里面的每个指针的值是不可变的。即你不能对 a[i] 进行赋值。

More Confusing Example II#

const int **p;
int * const *p;
int ** const p;
c

我们还是看 const 的位置。

const int **p 的 const 修饰 **p,说明 **p 是不可变的,即你不能对 **p 进行赋值。

int * const *p 的 const 修饰 *p,说明 *p 是不可变的,即你不能对 *p 进行赋值。

int ** const p 的 const 修饰 p,说明 p 是不可变的,即你不能对 p 进行赋值。

Summary#

依此类推,不管是几重指针,你都能一眼看出来 const 到底是在 const 谁了吧。

试试推理一下,下面的 const 都在修饰谁。

int *** const **p;
const int * const * const p;
const int ** const ** const a[10];
c
const 到底修饰谁?
https://sharkie.cn/blog/const-%E5%88%B0%E5%BA%95%E4%BF%AE%E9%A5%B0%E8%B0%81
Author sharkie
Published at July 8, 2025
Comment seems to stuck. Try to refresh?✨