常量指针和指针常量:理解C++中的底层const和顶层const

常量指针

常量指针的意思是指向常量的指针,其声明const要放在*的前面,而const和具体类型的顺序则无所谓,即

int a = 5;
const int * p = &a;

int a = 5;
int const * p = &a;

是没有区别的,均表示定义一个常量指针p。常量指针通常也被称作底层const(指向的底层变量为const),但需要注意,常量指针指向的变量不一定是const,声明其为常量指针只是说不能通过改指针修改指向变量的值,但如果变量本身非常量则仍然是可以修改的。例如:

*p =4;

会报错,但

a = 5;

是没有问题,且可以生效的。并且,常量指针本身是可以指向其他变量的,例如:

int a = 12;
int b = 13;
const int *p1 = &a;
p1 = &b;
cout << *p1 << endl; //输出 13

而赋值,常量指针只能接受常量指针的赋值,例:

int a = 3;
const int *p1 = &a;
//int *p2 = p1;  //错误,不能将底层const指针赋值给非底层const指针,(p1指向常亮,p1不能改变指向的值,如果p2 = p1,则可以执行*p2 = A,从而将p1指向的2值改变,故是非法)
const int *p3 = p1; //正确,可以将底层const指针复制给底层const指针

指针常量

指针常量的意思是指针本身是常量,在声明时必须初始化(对于类的话在构造函数里初始化),指针值无法修改,其声明const必须放在*之后,例如:

int a = 6;
int * const p = &a;

指针常量通常也被称为顶层const。指针常量本身值不能改变,但其指向的变量值是可以改变的,例:

int a = 6;
int * const p = &a;
cout << *p << endl; // 输出6
a = 12; 
cout << *p << endl; // 输出12

const_cast

const_cast一般用于底层const,也就是将常量指针变为非常量指针,当然要保证不出错的话,其指向的变量实际不能是常量。对于指针常量,由于常量本身作为右值赋值给非常量就是可以的,就像const_cast这种操作,本身加不加const_cast区别是不大的,所以基本不会使用,例如:

int a = 12;
int b = 23;
int const *p = &a;
int *p1 = const_cast (p);
*p1 = 23;
cout << a << endl; //没有问题, a=23
//****************************
int *const p2 = &a;
int *p3 = const_cast (p2); //没有问题,常量本来就可以赋值给变量
cout << *p3 << endl;

你可能感兴趣的:(C++编程,c++,c语言,开发语言)