静态指针与指向静态类型的指针

当将const与指针一起使用的时候,一般有两种情况,const被应用到指针指向的那个东西,或者const被应用到存储在指针中的内存地址。

第一种情况:pointer to const

注意:const修饰符绑定到离他最近的那个东西上。

const int* u; 

这里u是一个指针,指向一个const int。即为 (const int) (*u);

也就是说u不是静态的,所以它不需要初始化。

但需要注意:

int const* v;

这个表达方式与上面的那个表达式其实是一个意思!即 (int const) *v;

上面的两种情况会造成理解上的混乱,所以在实际的工作过程中应该坚持只使用第一种写法。

第二种情况:const pointer

要使指针本身变成const,你必须将const修饰符放在*的右边,如下所示:

int d =1;
int* const w = &d;

w是一个指针,它是const的,指向一个int类型。由于w是静态的,所以必须初始化。

但现在d是可变的:

d=2;
*w=3;

如果你不想指向的内容变化,可以:

int d =1;
const int* const x = &d;
int const* const x2=&d;

现在指针和指向的对象都不能变了,但请注意,只是x与x2的指向和内容不能变了,d还是可以赋值的。

实例

下面是一个实例。

//*其实是与标示符结合的,虽然我们写成int a;实际上写成int *a;更接近实际。
int d = 1;
int* const w = &d;
const int* const x = &d;
int const* const x2 = &d;
const int* u;
int const* v;
//*u = *x => error, *u is read only.

你能将一个non-const的对象的地址赋给一个const的指针,但你不能将一个const的对象的地址赋给一个non-const的指针!