C++中指針常量和常量指針的區別


     在C++學習使用過程中,每個人都不可避免地使用指針,而且都或多或少的接觸過常量指針或指針常量,但是對這兩個的概念還是很容易搞糊塗的。

本文即是簡單描述指針常量和常量指針的區別。

常量指針

  定義:

          又叫常指針,可以理解為常量的指針,也即這個是指針,但指向的是個常量,這個常量是指針的值(地址),而不是地址指向的值。

     關鍵點:

          1.常量指針指向的對象不能通過這個指針來修改,可是仍然可以通過原來的聲明修改;
          2.常量指針可以被賦值為變量的地址,之所以叫常量指針,是限制了通過這個指針修改變量的值;
          3.指針還可以指向別處,因為指針本身只是個變量,可以指向任意地址;

 代碼形式:

          int const* p;  const int* p;

指針常量

    定義:

         本質是一個常量,而用指針修飾它。指針常量的值是指針,這個值因為是常量,所以不能被賦值。 

    關鍵點:

          1.它是個常量!
          2.指針所保存的地址可以改變,然而指針所指向的值卻不可以改變;
          3.指針本身是常量,指向的地址不可以變化,但是指向的地址所對應的內容可以變化;

  代碼形式:

         int* const p;

指向常量的常指針

  定義:

     指向常量的指針常量就是一個常量,且它指向的對象也是一個常量。

   關鍵點:

        1.一個指針常量,指向的是一個指針對象;

        2.它指向的指針對象且是一個常量,即它指向的對象不能變化;

   代碼形式:

        const int* const p;

 

那如何區分這幾類呢? 帶兩個const的肯定是指向常量的常指針,很容易理解,主要是如何區分常量指針和指針常量:

一種方式是看 * 和 const 的排列順序,比如
     int const* p; //const * 即常量指針
     const int* p; //const * 即常量指針
     int* const p; //* const 即指針常量
還一種方式是看const離誰近,即從右往左看,比如
     int const* p; //const修飾的是*p,即*p的內容不可通過p改變,但p不是const,p可以修改,*p不可修改;
     const int* p; //同上
     int* const p; //const修飾的是p,p是指針,p指向的地址不能修改,p不能修改,但*p可以修改;

看代碼:

 1     //-------常量指針-------
 2     const int *p1 = &a;
 3     a = 300;     //OK,仍然可以通過原來的聲明修改值,
 4     //*p1 = 56;  //Error,*p1是const int的,不可修改,即常量指針不可修改其指向地址
 5     p1 = &b;     //OK,指針還可以指向別處,因為指針只是個變量,可以隨意指向;
 6 
 7     //-------指針常量-------//
 8     int*  const p2 = &a;
 9     a = 500;     //OK,仍然可以通過原來的聲明修改值,
10     *p2 = 400;   //OK,指針是常量,指向的地址不可以變化,但是指向的地址所對應的內容可以變化
11     //p2 = &b;     //Error,因為p2是const 指針,因此不能改變p2指向的內容
12     
13     //-------指向常量的常量指針-------//
14     const int* const p3 = &a;
15     //*p3 = 1;    //Error
16     //p3 = &b;    //Error
17     a = 5000;    //OK,仍然可以通過原來的聲明修改值

 

在實際應用中,常量指針要比指針常量用的多,比如常量指針經常用在函數傳參中,以避免函數內部修改內容。

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函數內部不會修改a、b的內容。

 

既然講到了指針,那順便說一下空指針、野指針的問題。
空指針就是保存地址為空的指針,使用指針時必須先判斷是否空指針,很多問題都是這一步導致的。
野指針是在delete掉指針之后,沒有置0,導致指針隨意指向了一個內存地址,如果繼續使用,會造成不可預知的內存錯誤。

另外指針的誤用很容易造成BUG或者內存泄漏。

看代碼:

 1     //-------空指針-------//
 2     int *p4 = NULL;
 3     //printf("%d",*p4); //運行Error,使用指針時必須先判斷是否空指針
 4 
 5     //-------野指針(懸浮、迷途指針)-------//
 6     int *p5 = new int(5);
 7     delete p5;
 8     p5 = NULL; //一定要有這一步
 9     printf("%d",*p5);  //隱藏bug,delete掉指針后一定要置0,不然指針指向位置不可控,運行中可導致系統掛掉
10     
11     //-------指針的內存泄漏-------//
12     int *p6 = new int(6);
13     p6 = new int(7); //p6原本指向的那塊內存尚未釋放,結果p6又指向了別處,原來new的內存無法訪問,也無法delete了,造成memory leak

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM