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