const 引用與指標

2022-06-01 16:39:32 字數 2619 閱讀 9211

希望這是最後一次修頂這篇essay了,之前寫的兩次都有些小毛病。|||打臉,又來更新了。。

ps:右值指的是字面常量和表示式求值過程中建立的臨時變數

我們忽略掉了相同型別是否可以賦值的情況(我到現在的學習裡都還可以相互賦值),以及型別相容的情況。只考慮const、&、*等修飾符帶來的影響

型別相容:

const:

底層const與頂層const的概念是針對指標和const的搭配的

底層const:

底層const寫在其他修飾符前面,也就是距離變數較遠的地方

頂層const:

指標:const type *ptr

此ptr認為自己指向的是乙個常量,不能改變所指物件的值,但還是可以釋放掉記憶體,該ptr也是乙個變數(左值),可以進行賦值,但不能讓它賦值給無const修飾的同型別的指標

type *const ptr

該ptr是常量(右值), 不接受賦值操作,ptr現在也變成了const常量

可以用它去賦值給無const修飾的同型別變數

頂層const問題:實際上是指標本身是不是常量和指標所指是不是乙個常量的兩個相互獨立問題。

恰好:底層const是指向看作"常量",本身看作"變數",只是不能賦值給其他變數;頂層const是本身是常量,指向是變數,可以複製給其他變數

(無const修飾)引用:

const type &temp = variate

variate可以是常量,也可以是變數,temp不能修改

(const type &temp 可以繫結右值,但是右值不一定都是const型別,這樣繫結後可能會使得temp失去原來右值的部分功能)

type & const temp = variate

規定不能這麼寫,可以進行。效果會類似於省略頂層const,既type & const temp == type & temp

int c = 10;

int & const b = c;

b = 5;

cout << c << endl; //結果是5

int a = 0, b = 5;

b = a;

a = 11;

上面這些操作都是直接作用於"記憶體變數"

int *d = &b; //d指標變數獲得b的指標

int &c = a; //c其實也獲得了a的指標,姑且稱為c_ptr

引用和指標在此時的彙編操作是一樣的,均是把右邊變數的指標取出放入左邊

c = 12; //此時相當於 *c_ptr = 12

這張彙編圖很清楚的展示了原理

那麼還有最後乙個問題,引用傳參、指標傳參和值傳遞的區別了?

我們既然知道了引用實際上也是指標操作,只是幫助我們隱去了部分指標操作而已。

void func(int &_a, int *_b, int _c)

func(a, &b, c);

c++不允許const t*轉換為t*型別,除非使用const_cast顯示地轉除const限定符

const int d = 0;

const int *c = &d;

int e = 1;

int *f = &e;

int **b = &f;

const int **a=b;//假設可以編譯通過

*a = c;//*a是const int *,c也是const int *型別,所以是對的

b初始化了a,修改*a也就是修改*b,此時*a,*b,c三者理論上指向同乙個記憶體。再看c是const int*,而*bint*型!間接導致了從const int*型到int *型的轉換!是不是就破壞了上面加粗的規則!

所以int**不能轉換為const int**!!!

如果把a定義為const int *const *a = b;自然就不能改變*a的值,這句*a=c就錯了,所以不會破環規則。

總結:int**之流可能通過const int **進行間接將const int *轉為int *,所以是違法的

const, 引用與指標

const int bufsize 512 對const的引用 簡稱為 常量引用 const int ci 1024 常量 const int r1 ci 對常量的引用 常量引用,不允許通過r1修改ci不能通過引用來改變它所繫結的值 double dval 3.14 const double rd ...

const與指標 引用

定義乙個指標 p const int p null intconst p null int const p null 上面兩行定義完全等價,第三行則不同。下面兩行定義也完全等價 const int const p null intconst const p null 舉例說明 int x 3 con...

指標 與 引用 還有const

指標 先定義乙個int型別的a,然後定義乙個指標p 指向 a 的位址 再定義乙個指向a的二重指標q,指向p的位址。int a 10 int p a int p p a so p 10 p a cout a is a cout p is cout p is p cout p is p int q a ...