1.指向const对象的指针
指向const对象的指针是一个指针,但是不能通过它修改它指向的对象的值.
声明方法:
const int *p ;
指向const对象的指针在初始化后不允许对它指向的对象的值进行修改.
const int int_n = 1 ;
const int *point_n = &int_n ;
*ponint_n = 2 ; //错误,指向 const 对象的指针在初始化后不允许对它指向的对象的值进行修改.
需要注意的地方:
(1)指向 const 对象的指针本身不是 const 类型,所以这个指针可以指向另一个 const 对象。
例:
const int int_n1 = 1 ;
const int int_n2 = 2 ;
const int *point_n ;
point_n = &int_n1 ; //使 point_n 指向 int_n1
point_n = &int_n2 ; //使 point_n 指向 int_n2
cout << *point_n << endl ;
(2)指向 const 对象的指针可以被赋予一个非 const 对象的地址,但是不能试图通过此指针来修改该对象的值。这里参考《C++primer》中的说法:“如果把 指向const对象的指针 理解为 ‘自以为指向const的指针’,这可能会对理解有所帮助。”
例:
int int_n = 1 ;
const int *point_n = &int_n ;
*point_n = 2 ; //错误,指向const对象的指针可以被赋予一个非 const 对象的地址,但是不能试图通过此指针来修改该对象的值.
(3)把一个 const 对象的地址赋给一个非 const 对象的指针是错误的.
例:
const int_n = 1 ;
int *point_n = &int_n ; //错误,把一个 const 对象的地址赋给一个非 const 对象的指针是错误的.
(4)不能使用 void* 指针保存 const 对象的地址,应该使用 const void* 指针保存 const 对象的地址.
const int_n = 1 ;
void *point_n = &int_n ; //错误,不能使用 void* 指针保存 const 对象的地址,应该使用 const void* 指针保存 const 对象的地址.
const void *point_n = &int_n ; //正确
2.const 指针
const 指针就是一个指针,但是它本身是 const 类型的.所以它初始化后不能再改变它的指向,即不能让它再指向一个新的对象.
声明方法:
int *const point_n ; //指向非 const 对象的 const 指针
const int *const point_n ; //指向 const 对象的 const 指针
const 指针可以指向 const 对象和非 const 对象,但是两者声明方法不同.
const 指针指向 const 对象时,不可以利用它修改它所指向的对象的值.但是 const 指针指向非 const 对象时,可以利用它修改它所指向的对象的值.
例:
int int_n1 = 1 ;
int int_n2 = 1 ;
int *const point_p1 = &int_n1 ; //const 指针 point_p1 指向非 const 对象
const int *const point_p2 = &int_n2 ; //const 指针 point_p1 指向 const 对象
*point_p1 = 2 ; //正确, const 指针指向非 const 对象时,可以利用它修改它所指向的对象的值.
*point_p2 = 2 ; //错误, const 指针指向 const 对象时,不可以利用它修改它所指向的对象的值.
3.两者的区分
其实要弄清以上两者的区别,只要明确两点:
(1)指针本身是 const 型还是非 const 型;
(2)指针所指向的对象是 const 型还是非 const 型.
如果指针名前紧邻的关键字是 const,那么它就是一个const指针.
如果声明指针所指向的对象类型前有 const关键字,那么它就是一个指向 const 对象的指针.
指向const对象的指针是一个指针,但是不能通过它修改它指向的对象的值.
声明方法:
const int *p ;
指向const对象的指针在初始化后不允许对它指向的对象的值进行修改.
const int int_n = 1 ;
const int *point_n = &int_n ;
*ponint_n = 2 ; //错误,指向 const 对象的指针在初始化后不允许对它指向的对象的值进行修改.
需要注意的地方:
(1)指向 const 对象的指针本身不是 const 类型,所以这个指针可以指向另一个 const 对象。
例:
const int int_n1 = 1 ;
const int int_n2 = 2 ;
const int *point_n ;
point_n = &int_n1 ; //使 point_n 指向 int_n1
point_n = &int_n2 ; //使 point_n 指向 int_n2
cout << *point_n << endl ;
(2)指向 const 对象的指针可以被赋予一个非 const 对象的地址,但是不能试图通过此指针来修改该对象的值。这里参考《C++primer》中的说法:“如果把 指向const对象的指针 理解为 ‘自以为指向const的指针’,这可能会对理解有所帮助。”
例:
int int_n = 1 ;
const int *point_n = &int_n ;
*point_n = 2 ; //错误,指向const对象的指针可以被赋予一个非 const 对象的地址,但是不能试图通过此指针来修改该对象的值.
(3)把一个 const 对象的地址赋给一个非 const 对象的指针是错误的.
例:
const int_n = 1 ;
int *point_n = &int_n ; //错误,把一个 const 对象的地址赋给一个非 const 对象的指针是错误的.
(4)不能使用 void* 指针保存 const 对象的地址,应该使用 const void* 指针保存 const 对象的地址.
const int_n = 1 ;
void *point_n = &int_n ; //错误,不能使用 void* 指针保存 const 对象的地址,应该使用 const void* 指针保存 const 对象的地址.
const void *point_n = &int_n ; //正确
2.const 指针
const 指针就是一个指针,但是它本身是 const 类型的.所以它初始化后不能再改变它的指向,即不能让它再指向一个新的对象.
声明方法:
int *const point_n ; //指向非 const 对象的 const 指针
const int *const point_n ; //指向 const 对象的 const 指针
const 指针可以指向 const 对象和非 const 对象,但是两者声明方法不同.
const 指针指向 const 对象时,不可以利用它修改它所指向的对象的值.但是 const 指针指向非 const 对象时,可以利用它修改它所指向的对象的值.
例:
int int_n1 = 1 ;
int int_n2 = 1 ;
int *const point_p1 = &int_n1 ; //const 指针 point_p1 指向非 const 对象
const int *const point_p2 = &int_n2 ; //const 指针 point_p1 指向 const 对象
*point_p1 = 2 ; //正确, const 指针指向非 const 对象时,可以利用它修改它所指向的对象的值.
*point_p2 = 2 ; //错误, const 指针指向 const 对象时,不可以利用它修改它所指向的对象的值.
3.两者的区分
其实要弄清以上两者的区别,只要明确两点:
(1)指针本身是 const 型还是非 const 型;
(2)指针所指向的对象是 const 型还是非 const 型.
如果指针名前紧邻的关键字是 const,那么它就是一个const指针.
如果声明指针所指向的对象类型前有 const关键字,那么它就是一个指向 const 对象的指针.