常引用、常量指針稼稿、指針常量薄榛、指向常量的常指針、空指針與野指針解釋

技術(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;                  //錯誤  

三.常量指針

  • 定義: 又叫常指針耳舅,可以理解為常量的指針,也即這個是指針倚评,但指向的是個常量,這個常量是指針的值(地址)馏予,而不是地址指向的值天梧。
  • 關(guān)鍵點:
    • 1.常量指針指向的對象不能通過這個指針來修改,可是仍然可以通過原來的聲明修改霞丧;
    • 2.常量指針可以被賦值為變量的地址呢岗,之所以叫常量指針,是限制了通過這個指針修改變量的值蛹尝;指針指向的地址可以改變后豫,但指針指向的地址所對應(yīng)的內(nèi)容不可以改變
    • 3.指針還可以指向別處,因為指針本身只是個變量突那,可以指向任意地址挫酿;
  • 代碼形式:
    int const* p;  const int* p;
    

四.指針常量

  • 定義:本質(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,仍然可以通過原來的聲明修改值
  • 在實際應(yīng)用中蹲缠,常量指針要比指針常量用的多刺洒,比如常量指針經(jīng)常用在函數(shù)傳參中,以避免函數(shù)內(nèi)部修改內(nèi)容吼砂。
    size_t strlen(const char* src); //常量指針逆航,src的值不可改變;
    char a[] = "hello";
    char b[] = "world";
    size_t a1 = strlen(a);
    size_t b1 = strlen(b);
    雖然a渔肩、b是可以修改的因俐,但是可以保證在strlen函數(shù)內(nèi)部不會修改a、b的內(nèi)容。
    

七.空指針與野指針

  • 空指針就是保存地址為空的指針抹剩,使用指針時必須先判斷是否空指針撑帖,很多問題都是這一步導(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)系作者
  • 序言:七十年代末泰演,一起剝皮案震驚了整個濱河市禀横,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粥血,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酿箭,死亡現(xiàn)場離奇詭異复亏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缭嫡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門缔御,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妇蛀,你說我怎么就攤上這事耕突。” “怎么了评架?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵眷茁,是天一觀的道長。 經(jīng)常有香客問我纵诞,道長上祈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮登刺,結(jié)果婚禮上籽腕,老公的妹妹穿的比我還像新娘。我一直安慰自己纸俭,他們只是感情好皇耗,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揍很,像睡著了一般郎楼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上女轿,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天箭启,我揣著相機(jī)與錄音,去河邊找鬼蛉迹。 笑死傅寡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的北救。 我是一名探鬼主播荐操,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼珍策!你這毒婦竟也來了托启?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤攘宙,失蹤者是張志新(化名)和其女友劉穎屯耸,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹭劈,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡疗绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了铺韧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多矮。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哈打,靈堂內(nèi)的尸體忽然破棺而出塔逃,到底是詐尸還是另有隱情,我是刑警寧澤料仗,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布湾盗,位于F島的核電站,受9級特大地震影響立轧,放射性物質(zhì)發(fā)生泄漏淹仑。R本人自食惡果不足惜丙挽,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匀借。 院中可真熱鬧颜阐,春花似錦、人聲如沸吓肋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽是鬼。三九已至肤舞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間均蜜,已是汗流浹背李剖。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留囤耳,地道東北人篙顺。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像充择,于是被迫代替她去往敵國和親德玫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容