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。