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非法。