指针、const 和 typedef

一、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类型。


        
   
         
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章