1.const
类型修饰符。用来修饰一个变量,使变量值无法被修改,得到了一个常量。
const在对变量进行修饰时, 变量类型的位置对const对变量的修饰效果是无影响的。只要const在变量名前,就将这个变量修饰为常量。如:
const int a = 0;
int const a = 0;
二者等价,都是将a修饰为常量。
2.const与一级指针的使用
const在修饰指针时,有了‘*’的参与 ,const与*的位置会使const产生截然不同的修饰效果。
const int a = 10, b = 20;
const int* p = &a;//等价于int const *p = &a;
1)const int* p;‘*’在const之后,const修饰 *p ,*p是指针,现在被修饰为常量类型的。这就是常量指针(常量类型的指针)。此时*p为常量,*p的值无法修改,即不可以通过*p=20(解引用)来修改a的值。所以如果变量a被const修饰为常量,则指向a的指针 *p 也必须被const修饰。不修饰会报错。
此时,虽然 *p 为 常量,值无法修改,但p不是,p没有被const修饰。所以我们还是可以通过p = &b 来修改p的指向。修改后 *p==20。
int a = 10, b = 20;
int* const q = &a;//等价于int const *q = &a;
2)int* const q;‘*’在const之前。q被const修饰,q是常量,q又是int*(指针类型)的。所以这就是指针常量(指针类型的常量)。 q的值无法被修改,即无法通过 q = &b来修改q的指向,q的指向锁定为b。
虽然q被修饰为常量,但 *q 没有被const修饰。所以我们可以通过 *q==20来修改a的值。
int a = 10, b = 20;
const int* const p = &a; //等价于int const* const p;
3)const int* const p;p被const修饰为常量,p又是const int* 类型的,所以这就是常指针常量。此时,p与 *p 同时被const修饰,即既不可以通过p = &b 来修改p的指向,也不能通过 *p = 20 来修改p所指向的a的值。
3.const和二级指针的使用
const在二级指针上的使用与const在一级指针上的使用相同。如:
int a = 10, b = 20;
int* p = &a;
int* q = &b;
const int* const* const t = &p;
此时,t,*t,**t都被const修饰。即,不可以通过 t = &q 来修改二级指针t向一级指针p的指向;不可以通过 *t = &b 来修改t所指向的一级指针p的指向(可以通过p = &b 来修改);不可以通过 **t = 20 来修改t所指向的p指向的a的值(可以通过*p = 20,或a = 20 来修改a的值)。