在c++中,帶const修飾符的指標很容易混淆,做個總結:
由於const物件的值不可以修改,所以不允許通過指標來改變其指向的const值,例如如下定義:
const double *cptr;
這裡cptr是乙個指向double型別const物件的指標,const限定了cptr指標所指向的物件型別,而非cptr本身。也就是說,cptr本身並不是const,在定義時不需要對它進行初始化,同時允許對cptr重新賦值,使其指向另外乙個const double物件。但是不能夠通過cptr修改其所指物件的值。
不能將乙個const物件的指標賦給非const物件的指標,例如下面的**會導致編譯錯誤:
const double pi = 3.14;
const double *cp = π // ok
double *p = &a; // error
const double pi = 3.14;
const void *vp = &pi // ok
void *p = π // error
允許將非const物件的抵制賦給指向const物件的指標,例如:
double pi = 3.14;
const double *cp = π // ok
但是無法通過指標p來修改pi的值:
*p = 3.0; // error
即指向const物件的指標實際上既可以指向const物件,也可以指向非const物件,但是都無法通過該指標來改變指向物件的值,可以直接給該物件賦值或者用其它的非const指標來改變物件的值:
double pi = 3.14;
const double *cp = π
dobule *p = π
*cp = 3.0; // error
*p = 3.0; // ok
pi = 3.0; // ok
所以,指向const物件的指標具有如下特性:
在實際使用中,通常將指向const物件的指標用作函式的行參,以此確保傳遞給函式的實際物件在函式中不因為行參而被改變。
const指標指的是本身被const修飾的指標,即本身的值不可以修改,它的定義如下:
int errnum = 0;
int const* curerr = &errnum;
則curerr是指向int物件的const指標,與其它const物件一樣,const指標也需要在定義的時候初始化,它自身的值也不可以改變(不可以再指向其它物件),但是const指標所指向的物件的值是否可以改變則完全取決於所指物件的型別,例如如上定義的errnum就可以修改值:
*curerr = -1;
如下定義指向const物件的const指標:
const int a = 0;
const int *const p = &a;
其中const物件a的值無法改變,const指標p的值也無法改變。
typedef string *pstring;
const pstring cstr;
該語句的含義是指向string型別的const指標,等價於:
string *const cstr;
指向const的指標和const指標
指向const的指標 int gorp 16 int chips 12 const int p snack gorp 其中p snack指向乙個const int。p snack 20 不被允許,p snack的值為const,禁止修改p snack指向的值,p snack chips 可以執行,p...
指向const物件指標 const指標
指向const物件指標 const指標 2010 07 22 16 40 1.指向const物件的指標 指向const物件的指標是乙個指標,但是不能通過它修改它指向的物件的值.宣告方法 const int p 指向const物件的指標在初始化後不允許對它指向的物件的值進行修改.const int i...
指向const物件指標 const指標
參見 110頁 陣列和指標 一節 指向const物件指標關鍵理解 const double cptr 指向const物件指標關鍵理解 可以指向非const物件,但不能通過該指標修改所指向物件的值,const指標關鍵理解 int const curerr errnumb const指標關鍵理解 cur...