const int *x 和 int * const x, const int& x和 int const &x的區別

一、const int&和int const&的區別

int const&表示此引用所代表的int類型變量無法使用此引用修改.
const int&表示此引用所代表的是const int類型變量,同樣也無法用此引用修改.

兩者的區別是:
int const&所代表的變量可以是int 和 const int .
const int&所代表的變量僅可以是 const int 

二、const int*和int* const的區別

關鍵問題點:const 屬於修飾符 ,關鍵是看const 修飾的位置在哪裏

1、const int *a
這裏const 修飾的是int,而int定義的是一個整值
因此*a 所指向的對象 值 不能通過 *a 來修改,但是 可以重新給 a 來賦值,使其指向不同的對象
eg:
  const int *a = 0;
  const int b = 1;
  int c = 1;
  a = &b //ok! 額外:注意不能通過a 來修改 b值
  a = &c //ok! 額外:雖然c本身不是一個常量

  *a = 2 //error! 問題就在這裏,不能修改通過 *a 所指向的對象值,最後賦值得對象是c,因此不能通過*a 來修改c值。

    首先const   修飾的是整個*a(注意,我寫的是*a而不是a)。所以*a是常量,是不能被賦值的(雖然a所指的b是變量,不是常量)。
     其次,a前並沒有用const 修飾,所以a是指針變量,能被賦值重新指向另一內存地址的。你可能會疑問:那我又如何用const 來修飾a呢?其實,你注意到int * const a中const 的位置就大概可以明白了。請記住,通過格式看語義。

2、int *const a  
這裏const修飾的是 a ,a代表的是一個指針地址
因此不能賦給a其他的地址值,但可以修改a指向的值
這有點和cont int *a相反的意味,例子就不說了
3、至於int const *a 和 const int *a 的意義是相同的 他們兩個的作用等價
補充:
4、const int * const a 
這個代表a所指向的對象的值以及它的地址本身都不能被改變
5.const int a = 10 和 int const a = 10有什麼區別?
這應該沒區別,指針的話有區別 

對指針來說,可以指定指針本身爲const,也可以指定指針所指的數據爲const,或二者同時指定爲const。


最後總結兩句:
     1).如果const 修飾在*pi前則不能改的是*pi而不是指pi。
     2).如果const 是直接寫在pi前則pi不能改。


關於const的點滴補充:
1、const 對象的地址只能賦值給指向const 對象的指針
2、指向const 對象的指針可以 被賦 以 一個非const 對象的地址 
3、指向const 的指針常被用作函數的形式參數,保證被傳遞給函數的實際對象在函數得實際對象在函數中不會被修改
4、常量在定義後就不能被修改,所以它必須被初始化。未初始化的常量定義將導致編譯錯誤(上面都是在說明const得問題,所以沒有賦值,實際語句中要賦值的)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章