1
2
const int i = 0;
const int* const p = &i;

上述代码所定义的指针是常量型的,同时,该指针指向一个常量型整数。

版权声明

本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。

本文不可以以纸质出版为目的进行改编、摘抄。

如第3章所述,常量(constant)是只读的对象。指针作为对象,既可以是变量,也可以是常量。

1
2
const int a = 10;
//int* p1 = &a; //错误:a的地址为const int*,而p1是int*

第2行代码错误,a的类型为const int,&a的类型为const int*,而p1的类型为int*。如果将a的地址赋值给p1,则意味着通过*p1可以修改对象a,a的常量特性被破坏。如果试图把一个指向常量对象的指针(&a)赋值给一个指向非常量对象的指针(p1),C++编译器会拒绝(C编译器不会)。

1
2
3
int b = 10;
const int* p2 = &b;
//*p2 = *p2 * 2; //错误:p2指向const int,不可以修改*p2

第2行代码正确无误。b为int,&b的类型为int*,p2为const int*,将&b赋值给p2,只是不允许通过p2修改b,赋值完成后,b仍然是变量。

第3行代码错误,p2是指向const int的指针,不允许修改*p2。

1
2
3
4
int c = 10, d = 11;
const int* const p3 = &c;
//*p3 = 101; //错误:p3指向const int,不可修改*p3
//p3 = &d; //错误:p3自身是常量,不可修改其值改变其指向

第2行代码里出现了两个const,对于指针p3而言,这两个const具有不同的意义:前者用于修饰p3指向的对象,意即p3所指向的对象为常量;后者用于修饰p3,意即p3是常量,除初始化赋值外,不可以修改p3的值改变其指向。如下图所示。

constptr

所以,第3行代码错误,*p3,即p3所指向的对象不可以修改;第4行也错误,不可以修改常量p3。