C/C++中的常量指針與指針常量

常量指針

常量指針是指向常量的指針,指針指向的內存地址的內容是不可修改的。

常量指針定義“const int *p=&a;”告訴編譯器,*p是常量,不能將*p作爲左值進行操作。但這裏的指針p還是一個變量,它的內容存放常量的地址,所以先聲明常量指針再初始化是允許的,指針也是允許修改的,例如:

複製代碼
int a=0,b=1;
const int *p;  //聲明常量指針p
p=&a;            //p指向a
p=&b;            //修改指針p讓其指向b,允許
*p=2;            //不允許
複製代碼

指針常量

指針常量是指針的常量,它是不可改變地址的指針,但可以對它所指向的內容進行修改。

指針常量定義"int *const p=&a;"告訴編譯器,p是常量,不能作爲左值進行操作,但允許修改其指向的內容,即*p是可修改的。指針常量必須在聲明的同時對其初始化,不允許先聲明一個指針常量隨後再對其賦值,這和聲明一般的常量是一樣的,例如:

複製代碼
int a=0,b=1;
int *const p1=&a; 
int *const p2;       //不允許,必須對其初始化
p2=&b;                 //不允許,p2是常量不允許作爲左值
*p1=2;                 //允許修改指針*p1的值
複製代碼

如果指針作爲函數參數,當我們不想被調用函數隨意修改參數指針而只是想修改參數指針指向的內容時,我們常把指針常量作爲參數。例如:

有兩個整形變量a,b,我們寫個函數用於交換a,b的值,利用指針作爲形參,函數修改參數指針的值是我們不希望的,這時可將參數設爲指針常量,如果函數對指針修改編譯是將報錯。

複製代碼
void Exchange(int *const a,int *const b)
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp
}
複製代碼

事實上,如果函數不修改參數本身的值,我們一般對參數加上const限定,這也是提高代碼質量的一個小技巧,在類的方法中,如果方法不修改類屬性的值,我們也常將方法加上const。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章