const指標和指向const物件的指標

2021-06-20 05:37:08 字數 1836 閱讀 5052

在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...