const与指针
const和指针之间有两种修饰关系,一种是const用来修饰指针本身----const指针,另一种是const修饰指针指向的对象----指向const对象的指针。
1、const指针
首先介绍const指针,即上述第一种情况,const用来修饰指针本身,只是限定该指针的内容不可以被修改,而指针所指向的对象则不加以限制。
只有一种用法:
int a;
int * const p = &a; (可理解为:p为一个指向int型的指针,该指针为const)
//因为指针的值不可以被修改,所以必须被初始化
2、指向const对象的指针
const用来修饰指针所指向的对象,通过该指针访问其所指对象时,对象具有const性质,即不可以通过该指针修改对象的值。不能使用指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指的对象。
有两种用法:
int b = 4;
const int *p = &b; (可以理解为:p为一个指针,指向的对象是const int型,推荐)
int const *q = &b; (不易理解,易混淆,不推荐使用)
b = 5;
*p = 6;
*q = 7;
通过比对,发现const指定义时,const在*的右边,const修饰的是指针(p),故p的值不可以被修改;而指向const对象的指针,定义时const关键字在*的左边,说明const修饰的是(*p),即指针指向的对象不能被修改。
3、指向const对象的const指针
const int * const p = &a;
4、指针与typedef
实例:
typedef int * pint;
const pint pi;
请问,pi是什么类型,简单的回答是const pint类型的指针。进一步问:const pint指针所表示的真实类型是什么?很多人都认为真正的类型是:
const pint * pi;
也就是说,const pint 是一种指针,指向int类型的const对象,但这是错误的。
解释: 声明const pint时,const修饰的是pint的类型,这是一个指针。因此,该声明语句应该是把pi定义为指向int类型对象的const指针。这个定义等价于:
int * const pi;
#include <iostream> using namespace std; int main() { int a = 4; int b; //定义const指针,指针本身值不能修改,必须初始化 int * const p1 = &a; *p1 = 5; //ok p1 = &b; //error //定义指向const对象的指针 const int *p2; int const *p3; p2 = &a; //ok p3 = &b; //ok a = 3; //ok *p2 = 3; //error p2 = p3; //ok //定义执行const对象的const指针,指针本身的值和指针指向的对象的值都不可以被修改 const int * const p4 = &a; int const * const p5 = &b; *p4 = 4; //error p4 = &b; //error typedef int *pint; const pint pi = &a; a = 9; *pi = 9; pi = &b; //error return 0; }
本文主要是自己在学习C++时的一些总结,希望对您的学习有些帮助。学习的主要参考资料:
http://www.cnblogs.com/younes/archive/2009/12/02/1615348.html
http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html
C++ Primer。