1. 程式人生 > >C++中常量指標和指標常量的區別

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

一、常量指標

常量指標本質是指標,常量修飾它,表示這個指標是一個指向常量的指標(變數),也就是指向一個無法修改的量。

C++中常量指標定義為:const int* a,當然int const * a也可以,不過習慣用第一種了。

使用常量指標時要注意,指標指向的物件不能通過這個指標來修改,因為物件現在是常量了,不可以修改,例如:

int tmp = 65;

const int *c = &tmp; // 這是合法的,但是*c就必須指向tmp了

*c = 6; // 非法,指向內容是常量!常量!常量!,無法修改。

其實我們使用的系統函式中,許多引數都是const修飾的。例如,strcmp宣告是這樣的:

int strcmp(const char *str1, const char *str2);

其中str1和str2都是常量字元指標,可是這個函式卻可以接收非常量字串。例如這段程式:

char *str1, *str2;

str1 = "gggggg";

str2 = "bbbbbb";

str1和str2的內容顯然是可以更改的,例如可以使用“str1[0] = b;”這樣的語句把str1的內容由“ggggg”變為“bgggg“”。因為函式的引數宣告用了常量指標的形式,就保證了在函式內部,一旦指向那個常量,指向內容就變成常量無法更改。所以對str1和str2的內容更改的操作在函式內部是不被允許的。

二、指標常量

指標常量的本質是一個常量,而用指標修飾它,指標無法修改,指標指向的內容可以修改。

在C/C++中,指標常量這樣宣告:

int a;

int *const b = &a; //此時const修飾a

只要const位於指標宣告操作符右側,就表明宣告的物件是一個常量即b,且它的內容是一個指標,也就是一個地址。

因為指標常量是一個常量,在宣告的時候一定要給它賦初始值。一旦賦值,以後這個常量再也不能指向別的地址,但是地址是的值可以改變。

char *a = “agafqawefga”;

char *b = "hdfafd"

int *const c = &b;

此時,c必須指向b,但是我們可以通過修改b上的值來修改c。

三、指標常量和常量指標

1,常量指標,是指向常量的指標,指標指向的內容無法修改,指標可以修改。

     指標常量,是一個常量,常量是指標,指標無法修改,指標指向的內容可以修改。

2,const char *p,const修飾(char  *),*p = 'b'非法,p =&q合法,

      char *const p = &b,const修飾(b),*p = 'b'合法,p = &q非法。