指針、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類型。


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