const限定符:使用关键字const对变量的类型做限定,如果我们希望这个变量的值不能被改变。
指针的特点:指针有两个值,一个是其自身的值(即所指变量的地址),一个是它所指向的值(指向的变量是何许人也),所谓指针的指向就是指针自身的值,改变指向就是改变地址。
1.没用const:
int main()
{
int a = 10, b = 20;
int* p = &a;//*p:定义指针p指向变量a,这里没有做任何限制,两个值都可以修改
*p = 100;//对
p = &b;//对
}
2.const在*p左侧:
int main()
{
int a = 10, b = 20;
const int* p = &a;//const在*p的左侧,所以它限制的是指针p所指向的值,自身的值可以改变
*p = 100;//错
p = &b;//对
}
3.const在p左侧:
int main()
{
int a = 10, b = 20;
int* const p = &a;//const在p的左侧,所以它限制的是p自身的值,即p的指向不可改变
*p = 100;//对
p = &b;//错
}
4.全都有const
int main()
{
int a = 10, b = 20;
const int* const p = &a;//这里*p和p的左侧均有const说明它的两个值都被限制了,都不可改变
*p = 100;//错
p = &b;//错
}
特殊说明:想弄清楚这些声明的含义,最有效的办法是从右往左进行阅读。
进一步地:
我们可以看到,指针本身是不是常量与指针所指向的变量是不是常量这是两个独立的问题。
因此就出现了修饰不同情况的名词:
顶层const(top-lever const):表示指针本身是一个常量;
底层const(low-level const):表示指针所指的对象是一个常量。
可以看出,顶层const其实不只是可以用来修饰指针,它可以用于表示任意的对象是常量,而底层const则与指针和引用等复合类型的基本类型有关。
例如:
int i = 0; //一个int类型变量i
int *const p1 = &i; //p1左边是const,顶层const,指针p1不能被修改
const int ci = 666; //这是一个const修饰的int类型变量ci,顶层const
const int *p2 = &ci; //p2的左边是*,*的左边是const,修饰*p2,底层const,指针p2可以被修改
PS:转载注明出处,如有侵权请联系作者删除。