- 常量指针表示常量的指针也就是说这个指针是用来指向常量的,它指向的值(这个值是常量值)不能变;指针常量表示它是指针这个类型下的常量,它就是一个常量,它的值不能变,也就是它指向的那个地址不能变。
- 常量指针指针指向的值不可以修改,指针的指向可以修改
- 指针常量指针指针的指向不可以修改,指针指向的值可以修改
- const修饰的指针常量指针指向的值和指针的指向均不可以修改
- 指针常量和const修饰的指针常量必须初始化,而常量指针不必初始化
1 const int* p1;//该对象不是一个常量,因此它的值(指向的地址)能够改变,但是它指向的对象不可以改变,因此是一个底层const 2 int* const p2;//错误,未初始化本地变量,该对象是常量,必须初始化,初始化后它的值(指向的地址)就不能改变了因此是一个顶层const 3 const int* const p3;//错误,未初始化本地变量,该对象是常量(它是一个常量指针下的常量,首先常量指针也属于一种指针,常量指针下的常量说明它的值不能变(也就是它指向的地址不能变),而它又是常量指针是一个用来指向常量的指针,所以它指向的值不能变),必须初始化,初始化后它的值(指向的地址)就不能改变了因此是一个顶层const
- 常量指针和const修饰的指针常量可以指向const修饰的变量,指针常量不可以(它们三个均可以指向非常量)
1 const int a = 10; 2 3 const int* p1= &a; 4 int* const p2= &a;//错误"const int *" 类型的值不能用于初始化 "int *const" 类型的实体 5 const int* const p3= &a;
1 const int a = 10; 2 3 const int* p1= &a; 4 const int* const p3= &a; 5 cout << "p1=" << p1 << endl << "*p1=" << *p1 << endl; 6 cout << "p3=" << p3 << endl << "*p3=" << *p3 << endl;
运行结果: