河北網(wǎng)站建設(shè)排名站長(zhǎng)seo查詢工具
問題
常量指針和指針常量有什么區(qū)別?
const的優(yōu)點(diǎn)
在C++中,關(guān)鍵字const用來只讀一個(gè)變量或?qū)ο?#xff0c;它有以下幾個(gè)優(yōu)點(diǎn):
- 便于類型檢查,如函數(shù)的函數(shù) func(const int a) 中a的值不允許變,這樣便于保護(hù)實(shí)參。
- 功能類似于宏定義,方便參數(shù)的修改和調(diào)整。如 const int max = 100;
- 節(jié)省空間,如果再定義a = max,b=max…等就不用在為max分配空間了,而用宏定義的話就一直進(jìn)行宏替換并為變量分配空間
- 為函數(shù)重載提供參考,即可以添加const進(jìn)行重載。
常量指針和指針常量的區(qū)別
首先要區(qū)分常量指針和指針常量分別是什么,這里有一種很好的記憶方法:
指針(*)和常量(const)誰在前先讀誰 ; 象征著地址,const象征著內(nèi)容;誰在前面誰就不允許改變。*
int a = 1;
int b = 2;
int c = 3;
int const *p1 = &b; // const在前,p1為常量指針
int *const p2 = &c; // * 在前,p2為指針常量
//注意:允許將非const對(duì)象的地址賦給指向const對(duì)象的指針,所以第4行代碼是正確的
常量指針p1:即指向const對(duì)象的指針,指向的地址可以改變,但其指向的內(nèi)容(即對(duì)象的值)不可以改變。
//p1可以改變,但不能通過p1修改其指向的對(duì)象(即 b)的值;不過,通過其他方式修改b的值是允許的
p1 = &a; //正確,p1是常量指針,可以指向新的地址(即&a),即p1本身可以改變
*p1 = a; //錯(cuò)誤,*p1是指針p1指向?qū)ο蟮闹?#xff0c;不可以改變,因此不能對(duì)*p重新賦值
指針常量p2:指針本身是常量,即指向的地址本身不可以改變,但內(nèi)容(即對(duì)象的值)可以改變。
p2 = &a; //錯(cuò)誤,p2是指針常量,本身不可以改變,因此將a的地址賦給p2是錯(cuò)誤的
*p2 = a; //正確,p2指向的對(duì)象允許改變
**補(bǔ)充:**要分辨是常量指針還是指針常量,可以從右向左來看其定義,具體如下:
①對(duì)于 int const *p1=&b,先將*和p1結(jié)合,即p1首先是一個(gè)指針,然后再左結(jié)合const,即常量指針,它指向了const對(duì)象,因此我們不能改變 *p1的值。
②對(duì)于 int *const p2=&c,現(xiàn)將const和p2結(jié)合,即p2首先是一個(gè)常量,然后再左結(jié)合*,即指針常量,它本身是一個(gè)常量,因此我們不能改變p2本身。另外因?yàn)閜2本身是const,而const必須初始化,因此p2在定義時(shí)必須初始化,即不能直接 int *const p2;
參考資料
常量指針和指針常量的區(qū)別詳解
《C++ Primer》