int a = 1;
int b = 2;
const
int *c = &a;
const
int* &d = c;
const
int* const &e = c;
d = &b;//正確
e = &b;//錯誤
*d = 3;//錯誤
int *f = &a;
int* &g = f;
int* const &h = f;
g = &b;//正確
h = &b;//錯誤
*g = 3;//正確
當const引用是引用的乙個指標的時候,那麼指標的值是不能通過這個引用來改變值的。而前面的const int *則表示 指標所指向的類容是不能改變的。
知乎看的
int a = 10;
int *b = &a;
const
int* &p = b;//錯誤
const
int* const &p = b;//正確
直接編譯得到的錯誤資訊是:
error: invalid initialization of non-const reference of type 'const int*&' from an rvalue of type 'const int*'
對於**:
const int* &p = b;
左邊定義了乙個叫p的引用。如果你寫成 int* const &p,那麼p無疑是『指向int*的常引用』。但原來的寫法,p實際上是乙個『指向const int*的(非常)引用』。那麼等號右邊呢?本來b是個左值,但型別是int*而非const int*。根據c++標準,下列隱式轉換是允許的:
b是個int*左值,因此不能直接使用第二條規則來把它變成乙個const int*左值。因此,先通過第一條規則把它轉化成了右值,再使用第二條規則轉化為const int*。等價於:
int const * & p = static_cast(b);
但此時:
基於以上兩點,最終觸發了『不能用乙個const int*右值來初始化乙個對const int*的非常引用』的錯誤。
右邊是右值,當然不能被左值引用捕獲。不過c++還有乙個特別的規定,就是如果左邊是t const &的話,可以隱式捕獲乙個右值並延長他的生命週期。於是你寫:
int * const & p = b;
int const * const & p = b;
就沒有問題。 指標和引用,const 指標和const 引用
指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...
當const遇上指標
const關鍵字 可以有很多用處,比如 define row 10 就代表row的值恒為10,不可修改。而const int row 10 也可以將值恆定,無法修改。還有 const int num 10 將陣列整個保護,無法修改。但,並不是將被保護量變為常量,而是在處理時將其看為常量,不能對其修改...
當const遇上了指標
將指標指向常量物件,這樣可以防止使用指標來修改所指向的值 int num 6 const int p p 8 非法,不能改變指向常量物件的值 但是,物件num本身不是常量可以被修改 num 8 合法的 也就是說,它指向的那個值並不是常量,因此我們不能通過p來修改它指向的值但是可以修改num的值從而修...