一、const int* p 和 int* const p
const int* p;
p是指向int类型变量的指针,p所指向的变量为const类型。p指向的变量不能修改。
int* const p;
p是指向int类型变量的指针,p为const类型。p的值不能修改,即p不能由指向变量A改为指向变量B。
二、const int* p和int* p
int* p;
p是指向int类型变量的指针,而不能指向const int类型变量,即:
int i;
const int j;
p = &i; //正确
p = &j; //错误
const int*p;
p是指向const int类型变量的指针,p也可以指向int 类型变量,但不能通过p修改此变量。所以常常指定形参为const类型,表示不能修改此形参的值,而实参为非const类型时也可以正常调用函数。
int i;
const int j;
p = &i; //正确,但不能通过p修改i
*p = 2; //错误,不能通过const int*修改其指向的变量
p = &j; //正确
在C和C++的字符串转换中就存在char* 与const char*的区别:
string str1;
char* p1 = str1.c_str(); //错误,string.c_str()返回const char*类型
const char* p = str1.c_str(); //正确,但修改str1之后,不能通过p获得字符串
三、const与typedef
当用typedef给指针类型区别名,此别名又遇到const关键字时情况会变得有些奇怪:
typedef string* pstring;
string str = "1";
pstring str1 = &str;
const pstring str2 = &str;
pstring const str3 = &str;
*str2 = "2";
cout<<*str2<<endl;
*str3 = "3";
cout<<*str3<<endl;
首先,str2和str3都是指向string的指针。然后,str2和str3如果不在定义时初始化,vs2010会提示错误:“必须初始化常量对象”,这说明str2、str3都是string* const类型或者都是是const string* const类型。最后,可以通过str2和str3修改其指向的变量(对象),所以它们是string*
const类型。
为什么会这样呢?先来看看下面这个例子:
const int i = 1;
int const j = 2;
我们知道,上面的i、j都是const int类型。
再来看看typedef关键字的特点:typedef与#define不同,#define是在编译的预处理环节对源码进行简单的替换,而typedef关键字常常用来给类型取别名。typedef string* pstring指定了pstring类型是字符串指针,所以const pstring str2和pstring const str3所定义的变量str2和str3都是字符串指针型常量,即string* const类型。