在 C/C++ 中,我们经常会看到 const,但是如果它和指针一起出现,我们老是会弄混,其实只需要看 const 的位置就知道 const 到底在修饰谁了。
Simplest Example#
const int v = 10; // 这是修饰 v,表示 v 的值不可变
cConfusing 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