常量指標與指向常量的指標不同,常量指標指的是指標自身是個常量,指向常量的指標表示該指標指向的物件是個常量。表示方法如下:
常量指標: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...