目录
1. 指向常量的指针
1.1 声明
声明:const 类型 * 指针名 = 地址;
1.2 含义
顾名思义就是指针指向对象的类型是一个常量类型,即const 类型 ,不能通过指针的方式修改其所指对象的值。类型是指基本数据类型,不含指针类型。
- 指向“常量”的“常量”是针对指针本身而言,实际上的对象可能是一个常量或者变量。(即使实际上的对象是变量也不能通过指向常量的指针改变它的值,但是它本身是可以改变的)
- 指向常量的指针是一个指针变量,即可以改变指针的值。
例如以下代码是合法的:
const float PI = 3.14159;
float pi = 6.66;
const float* p = Π
cout << *p << endl;
p = π
cout << *p << endl;
但是如果试图使用指针改变其所指对象的值,编译器即会报错:
const float PI = 3.14159;
float pi = 6.66;
const float* p = &PI;
cout << *p << endl;
p = π
cout << *p << endl;
*p = 1.1;//非法的
1.3 拓展
1.3.1 常量地址赋值
常量的地址不能赋给指向变量的指针(为了防止常量值被修改),如果一定要这么操作,通常需要使用const_cast运算符作类型转换,如此常量的地址就可以赋给指向变量的指针。但是使用指针不一定能够修改这个常量的值。
如执行以下代码编译器会报错:
const float PI = 3.14159;
float* p;
p = &PI;
将常量地址作类型转换赋给指针(指向变量的):
int main()
{
const float PI = 3.14159;
float* p;
p = const_cast<float *>(&PI);
cout << "*p:" << *p << endl;
cout << "PI=" << PI << endl;
*p = 5.14;
cout << "*p:" << *p << endl;
cout << "PI=" << PI << endl;
}
可见,PI的值并没有被修改。
1.3.2 指向指针的指针
- 声明:类型 ** 变量名;例如:int ** pp;
- 指向指针的指针的值是另一个指针的地址;
- 指向指针的指针的值必须和它声明的类型相对应,如以下代码修改自C++ Primer Plus(第六版)第222页:
int main()
{
const int** pp2;
int* p1;
const int n = 13;
//pp2 = const_cast<const int**>(&p1);
pp2=&p1;
*pp2 = &n;
*p1 = 10;
cout << "n:" << n << endl;
cout << "p1:" << p1 << endl;
cout << "pp2:" << pp2 << endl;
}
报错的原因是pp2关联的类型是const int*,而p1的类型却是int*,类型不匹配。
1.3.3 小结
如果数据类型本身不是指针,则可以将const数据或非const数据的地址赋给指向const的指针,但只能将非const数据的地址赋给非const指针
2. 指针常量
2.1 声明
声明:类型 * const 名字。例如:int* const p = &p1;
2.2 含义
可以联系基本数据类型的常量来理解。如float PI = 3.14159,PI就是一个常量,只能访问而不能修改,并且声明时同时初始化。指针常量作为常量当然也具备一般常量的特性:只能访问而不能修改,声明时初始化。例如以下程序:
int main()
{
int i, j;
int* const p = &i;
p = &j;
}
编译之后即报错:
p是一个指针常量,初始化之后不能改变它的值。但是可以改变其指向的对象的值,例如:
int main()
{
int i=1;
int* const p = &i;
cout << "i=" << i << endl;
*p = 10;
cout << "i=" << i << endl;
}
执行结果:
3. 指向常量的指针常量
3.1 声明
声明:const 类型* const 名字 = 初始化地址。例如:const int* const p1 = &p;
3.2 含义
特性就是综合以上1、2的性质:既不能改变指针的值,也不能改变指向对象的值。