技術(shù)交流QQ群:1027579432让歼,歡迎你的加入敞恋!
1、一.基礎(chǔ)知識
- 引用并非對象
- 引用必須初始化
- 引用只能綁定在對象上谋右,而不能與字面值或某個表達(dá)式的計算結(jié)果綁定在一起
- 類型要嚴(yán)格匹配
int &a = 10; //錯誤:引用類型的初始值必須是一個對象
double a = 3.14;
int &b = a; //錯誤:此處引用類型的初始值必須是int型對象
- 指針本身就是對象
- 指針的類型要和它指向的對象嚴(yán)格匹配
double dval;
double *pd = &dval; //正確
double *pd2 = pd; //正確
int *pi = pd; //錯誤:指針pi的類型和pd的類型不匹配
pi = &dval; //錯誤:試圖把double型對象的地址賦給int型指針
二.常量引用
- 初始化常量引用時允許用任意表達(dá)式作為初始值
int i = 42;
const int &r1 = i; //正確:允許將const int & 綁定到一個普通int對象上
const int &r2 = 42; //正確
const int &r3 = r1 * 2; //正確
int &r4 = r1 * 2; //錯誤
double dval = 3.14;
const int &ri = dval; //正確
//等價于
const int temp = dval;
const int &ri = temp;
int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0; //正確
r2 = 0; //錯誤
三.常量指針
四.指針常量
- 定義:本質(zhì)是一個常量,而用指針修飾它愕难。指針常量的值是指針早龟,這個值因為是常量,所以不能被賦值猫缭。
- 關(guān)鍵點:
- 1.指針常量的值是指針葱弟,這個值是常量,不能被修改猜丹;指向的地址不可以改變芝加,但指向的地址所對應(yīng)的內(nèi)容可以改變
- 2.指針本身是常量,指針指向的地址不可以變化,但是指針指向的地址所對應(yīng)的內(nèi)容可以變化射窒;
- 代碼形式:
int* const p;
五.指向常量的常指針
- 定義:指向常量的指針常量就是一個常量藏杖,且它指向的對象也是一個常量将塑。
- 關(guān)鍵點:
- 1.一個指針常量,指向的是一個指針對象制市;
- 2.它指向的指針對象且是一個常量抬旺,即它指向的對象不能變化;
- 代碼形式:
const int* const p;
六.那如何區(qū)分這幾類呢?
- 帶兩個const的肯定是指向常量的常指針祥楣,很容易理解开财,主要是如何區(qū)分常量指針和指針常量.
- 一種方式是看 * 和 const 的排列順序,比如
int const* p; //const * 即常量指針
const int* p; //const * 即常量指針
int* const p; //* const 即指針常量
- 還一種方式是看const離誰近误褪,即從右往左看责鳍,比如
int const* p; //const修飾的是*p,即*p的內(nèi)容不可通過p改變兽间,但p不是const历葛,p可以修改,*p不可修改嘀略;
const int* p; //同上
int* const p; //const修飾的是p恤溶,p是指針,p指向的地址不能修改帜羊,p不能修改咒程,但*p可以修改;
- 實例
//-------常量指針-------
const int *p1 = &a;
a = 300; //OK,仍然可以通過原來的聲明修改值讼育,
//*p1 = 56; //Error,*p1是const int的帐姻,不可修改,即常量指針不可修改其指向地址
p1 = &b; //OK,指針還可以指向別處奶段,因為指針只是個變量饥瓷,可以隨意指向;
//-------指針常量-------//
int* const p2 = &a;
a = 500; //OK,仍然可以通過原來的聲明修改值痹籍,
*p2 = 400; //OK,指針是常量呢铆,指向的地址不可以變化,但是指向的地址所對應(yīng)的內(nèi)容可以變化
//p2 = &b; //Error,因為p2是const 指針,因此不能改變p2指向的內(nèi)容
//-------指向常量的常量指針-------//
const int* const p3 = &a;
//*p3 = 1; //Error
//p3 = &b; //Error
a = 5000; //OK,仍然可以通過原來的聲明修改值
七.空指針與野指針
- 空指針就是保存地址為空的指針抹剩,使用指針時必須先判斷是否空指針撑帖,很多問題都是這一步導(dǎo)致的。
- 野指針是在delete掉指針之后澳眷,沒有置0胡嘿,導(dǎo)致指針隨意指向了一個內(nèi)存地址,如果繼續(xù)使用钳踊,會造成不可預(yù)知的內(nèi)存錯誤衷敌。另外指針的誤用很容易造成BUG或者內(nèi)存泄漏。
//-------空指針-------//
int *p4 = NULL;
//printf("%d",*p4); //運行Error拓瞪,使用指針時必須先判斷是否空指針
//-------野指針(懸浮缴罗、迷途指針)-------//
int *p5 = new int(5);
delete p5;
p5 = NULL; //一定要有這一步
printf("%d",*p5); //隱藏bug,delete掉指針后一定要置0祭埂,不然指針指向位置不可控面氓,運行中可導(dǎo)致系統(tǒng)掛掉
//-------指針的內(nèi)存泄漏-------//
int *p6 = new int(6);
p6 = new int(7); //p6原本指向的那塊內(nèi)存尚未釋放,結(jié)果p6又指向了別處蛆橡,原來new的內(nèi)存無法訪問舌界,也無法delete了,造成memory leak
八.參考資料
1.菜鳥教程
2.C++中指針常量和常量指針的區(qū)別
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者