最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

常引用、常量指針、指針常量、指向常量的常指針、空指針與野指針解釋

2020-11-08 17:56 作者:C語言PLUS_  | 我要投稿

技術(shù)交流QQ群:1021486511,歡迎你的加入!

1、一.基礎(chǔ)知識

  • 引用并非對象

  • 引用必須初始化

  • 引用只能綁定在對象上,而不能與字面值或某個表達式的計算結(jié)果綁定在一起

  • 類型要嚴格匹配

int &a = 10; ? ? ? ? ? ? //錯誤:引用類型的初始值必須是一個對象 ? ?double a = 3.14; ?int &b = a; ? ? ? ? ? ? ?//錯誤:此處引用類型的初始值必須是int型對象

  • 指針本身就是對象

  • 指針的類型要和它指向的對象嚴格匹配

double dval; ?double *pd = &dval; ? ? ?//正確 ?double *pd2 = pd; ? ? ? ?//正確 ? ?int *pi = pd; ? ? ? ? ? ?//錯誤:指針pi的類型和pd的類型不匹配 ?pi = &dval; ? ? ? ? ? ? ?//錯誤:試圖把double型對象的地址賦給int型指針 ?

二.常量引用

  • 初始化常量引用時允許用任意表達式作為初始值

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ū)分常量指針和指針常量.

    int const* p; ? ?//const * 即常量指針const int* p; ? ?//const * 即常量指針int* const p; ? ?//* 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離誰近,即從右往左看,比如

    • 一種方式是看 * 和 const 的排列順序,比如

  • 實例

//-------常量指針-------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; ? ?//Errora = 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)容。

七.空指針與野指針

  • 空指針就是保存地址為空的指針,使用指針時必須先判斷是否空指針,很多問題都是這一步導致的。

  • 野指針是在delete掉指針之后,沒有置0,導致指針隨意指向了一個內(nèi)存地址,如果繼續(xù)使用,會造成不可預知的內(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,不然指針指向位置不可控,運行中可導致系統(tǒng)掛掉//-------指針的內(nèi)存泄漏-------//int *p6 = new int(6);p6 = new int(7); //p6原本指向的那塊內(nèi)存尚未釋放,結(jié)果p6又指向了別處,原來new的內(nèi)存無法訪問,也無法delete了,造成memory leak

八.參考資料

https://ke.qq.com/course/2930584?tuin=a0c081ff


常引用、常量指針、指針常量、指向常量的常指針、空指針與野指針解釋的評論 (共 條)

分享到微博請遵守國家法律
郎溪县| 屏南县| 蒙阴县| 西安市| 河南省| 遂平县| 邓州市| 涡阳县| 尤溪县| 安化县| 武城县| 建阳市| 依兰县| 社旗县| 图木舒克市| 荔浦县| 沁阳市| 明光市| 隆尧县| 南雄市| 延吉市| 奉化市| 沧源| 祁东县| 盐城市| 都安| 桂平市| 浦东新区| 花莲市| 舞阳县| 馆陶县| 高阳县| 汉中市| 淮南市| 仁布县| 集贤县| 荣昌县| 乌兰察布市| 大名县| 通辽市| 和田县|