常量指針與指針常量的區別


一、常量指針

常量指針本質是指針,常量修飾它,表示這個指針乃是一個指向常量的指針(變量)。

指針指向的對象是常量,那么這個對象不能被更改。

在C/C++中,常量指針是這樣聲明的:

1)const int *p;

2)int const *p;

使用常量指針時要注意,指針指向的對象不能通過這個指針來修改,但仍然可以通過原來的聲明修改,也就是說常量指針作為一個指針,被賦值為變量的地址,但是限制了通過這個指針修改變量的值。例如:

int a = 5;

const int b = 8;

  const int *c = &a; // 這是合法的,非法的是對c的使用

*c = 6; // 非法,但可以這樣修改c指向的對象的值:a = 6;

const int *d = &b; // b是常量,d可以指向b,d被賦值為b的地址是合法的

細心的朋友在使用字符串處理函數的時候,應該會注意到這些函數的聲明。它們的參數一般聲明為常量指針。例如,字符串比較函數的聲明是這樣的:

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

可是這個函數卻可以接收非常量字符串。例如這段程序:

char *str1, *str2;

str1 = "abcde1234";

str2 = "bcde";

if(strcmp(str1, str2) == 0)

{

printf("str1 equals str2.");

}

str1和str2的內容顯然是可以更改的,例如可以使用“str1[0] = x;”這樣的語句把str1的內容由“abcde1234”變為“xbcde1234”。因為函數的參數聲明用了常量指針的形式,就保證了在函數內部,那 個常量不被更改。也就是說,對str1和str2的內容更改的操作在函數內部是不被允許的。

二、指針常量

 

指針常量的本質是一個常量,而用指針修飾它,那么說明這個常量的值應該是一個指針。

 

指針常量的值是指針,這個值因為是常量,所以不能被賦值。

 

在C/C++中,指針常量這樣聲明:

 

int a;

 

int *const b = &a; //const放在指針聲明操作符的右側

只要const位於指針聲明操作符右側,就表明聲明的對象是一個常量,且它的內容是一個指針,也就是一個地址。上面的聲明可以這么讀,聲明了一個常量b,它的值是變量a的地址(變量a的地址,不就是指向變量a的指針嗎)。

因為指針常量是一個常量,在聲明的時候一定要給它賦初始值。一旦賦值,以后這個常量再也不能指向別的地址。

雖然指針常量的值不能變,可是它指向的對象是可變的,因為我們並沒有限制它指向的對象是常量。

因此,有這么段程序:

char *a = "abcde1234";

char *b = "bcde";

char *const c = &a;

  下面的操作是可以的。

  a[0] = 'x'; // 我們並沒有限制a為常量指針(指向常量的指針)

或者

*c[0] = 'x' // 與上面的操作一致

三、指向常量的指針常量

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

因為是一個指針常量,那么它指向的對象當然是一個指針對象,而它又指向常量,說明它指向的對象不能變化。

在C/C++中,這么聲明:

  const int a = 25;

const int * const b = &a;

看,指針聲明操作符左邊有一個const,說明聲明的是一個指向常量的指針。再看,指針聲明操作符右邊有一個const,說明聲明的是一個指針常量。前后都鎖死了,那么指向的對象不能變,指針常量本身也不能變。

 


免責聲明!

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



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