C 常量指標與指向常量的指標詳解

2021-10-10 19:49:33 字數 2627 閱讀 4252

常量指標與指向常量的指標不同,常量指標指的是指標自身是個常量,指向常量的指標表示該指標指向的物件是個常量。表示方法如下:

常量指標:int *const p

指向常量的指標:const int *p

指向常量的常量指標:const int *const p

類似於「常量引用」(即指向 const 變數的引用,或指向常量的引用),指向常量的指標不能用於改變其所指物件的值。

(1)要想存放常量物件的位址,只能使用指向常量的指標。

const double dval = 3.14;       // dval 是個常量,它的值不能改變

double *ptr = &dval; // 錯誤:ptr 是乙個普通指標

const double *cptr = &dval; // 正確:定義指向常量的指標

*cptr = 42; // 錯誤:不能通過指向常量的指標來修改其所指物件的值

(2)允許令乙個指向常量的指標指向乙個非常量物件,但不允許通過該指標修改其所指物件的值。

和「常量引用」一樣,指向常量的指標也沒有規定其所指的物件必須是乙個常量。所謂指向常量的指標僅僅要求不能通過該指標改變物件的值,而沒有規定那個物件的值不能通過其他途徑改變。

double dval = 3.14;             // dval 是個雙精度浮點數,其值可以改變

const double *cptr = dval; // 正確:但是不可以通過 cptr 改變 dval 的值

試試這樣想吧:所謂指向常量的指標或者引用,不過是指標或引用「自以為是」罷了,它們覺得自己指向了常量,所以自覺地不去改變所指物件的值。

(3)與「常量引用」不同的是,指向常量的指標不能指向字面值或者乙個一般表示式,因為它們不是乙個物件。

要時刻記住,指標是用來存放其他物件的位址的。

在為指標賦值時,可以使用&運算子來獲取物件的位址,將其賦值給指標;如果要使用乙個字面值常量來為指標賦值,只能使用0來為指標賦值,因為0等價於null(此時的0必須是字面值常量,不可以是整型型別的物件,因為型別不匹配,除非進行強制型別轉換),而不可以使用其他整型數值(無論是字面值常量,或者是整型型別的物件)來為指標賦值。

int i = 0;  

int *p1 = 0; // 正確:可以使用 0 來為指標初始化,相當於 null

int *p2 = i; // 錯誤:型別不匹配,需要進行強制型別轉換。

int *p3 = (int *)i; // 正確:強制型別轉換後可以使用整型物件為指標賦值

int *p4 = 3; // 錯誤:不可以直接用 0 之外的整型字面值為指標賦值或初始化

int *p5 = (int *)3; // 正確:p5 的值為 0x3

在下面例子中,自然也就不能使用乙個字面值常量來為cptr1賦值,更不能使用&獲取字面值常量的位址;表示式的計算結果是乙個臨時物件,不可以使用&獲取臨時物件的位址。

double dval = 42;

const double *cptr1 = 42; // 錯誤:不能使用乙個非 0(null) 的值來初始化指標

指標是物件而引用不是,因此就像其他物件型別一樣,允許把指標本身定義為常量。

(1)常量指標必須初始化。

因為 const 物件必須初始化,而常量指標也作為常量物件,所以也必須初始化。

而且一旦初始化完成,則它的值(也就是存放在指標中的那個位址)就不能再改變了。

int errnumb = 0;

int *const curerr = &errnumb; // curerr 將一直指向 errnumb

const double pi = 2.14;

const double *const pip = π // pip 是乙個指向常量物件的常量指標

curerr是乙個常量指標,其指向了乙個普通的整型物件;pip也是乙個常量指標,它指向的物件是乙個雙精度浮點型常量。

(2)指標本身是乙個常量並不意味著不能通過指標修改其所指物件的值,能否這樣做完全依賴於所指物件的型別。

例如pip還是乙個指向常量的常量指標,則不論是pip所指的物件值還是pip自己儲存的那個位址都不能改變。相反的,curerr指向的是乙個一般的非常量整數,那麼完全可以用curerr去修改errnumb的值:

*pip = 2.72;                // 錯誤:pip是乙個指向常量的指標

if(*curerr)

C 常量指標,指標常量,指向常量的常指標詳解

目錄 指標就是指向變數在記憶體中的位址 資料是存放在記憶體中的,每乙個變數都有乙個記憶體位址,假設是乙個int型別變數a,佔4個位元組的記憶體區,那麼在記憶體中如果是小端方式儲存,我們建立指標p,把a的位址賦值給p,就是把a的首位址0x1100賦值給指標p,這個時候p的值就是變數a在記憶體中的首位址...

c 常量指標與指向常量的指標

這是兩個初學者容易混淆的概念。比如,t pt new t const t pct pt 指向常量 const t 的指標 t const cpt pt 常量指標,指向t 不過使用乙個引用比使用乙個常量指標更簡單 const t rct pt 不用const t const t rt pt 不用t c...

常量指標與指向常量的指標

在日常交流中,當乙個 c 程式設計師說 常量指標 const pointer 時,其實他表達的意思往往是 指向常量的指標 pointer to const 真不幸,這是兩個完全不同的概念。t pt new t 乙個指向t的指標 const t pct pt 乙個指向const t的指標 t cons...