c c 區別(二 6 引用

2021-09-01 12:01:37 字數 3291 閱讀 6447

第6個區別:引用 

一.引用傳入

變數:記憶體單元的別名

引用:記憶體單元的別名

引用是乙個別名

底層處理:c++中和指標處理相同 在用到引用變數的地方 系統會自動解引用 引用開闢記憶體

引用的特點

必須要初始化

引用初始化的變數一定要可以取位址

引用是不可改變的

引用只能訪問引用變數所引用的記憶體單元

二.1.const和一級指標引用的結合

const只是為了杜絕間接訪問修改常量記憶體塊的風險

間接訪問:

2.const和二級指標的結合

eg:  (1) const int a = 10;          修改後         const int a = 10;

int* p = &a;              ---------->        const int* p =&a;

int** q= &p;                              const int**q = &p;

此時const修飾a,const修飾誰 誰就是直接訪問 直接訪問:a 間接訪問:*p ,**q

只看間接訪問 這兩個前面都沒有加修飾 於是都加上const 杜絕修改常量記憶體塊的風險 成為const*p ,const**q

(2)int a = 10;                   修改後         int a = 10;

const int* p = &a;           -------------->       const int*p = &a;

int **q=&p                                 const int**q=&p;

此時const修飾*p,直接訪問:a,(*p就是a),間接訪問:*p,**q(從const修飾的那一行看起 因為const之前的都是普通變數 沒有問題)

只看間接訪問 此時*p加了修飾 而**沒有加 加上const即可

(3)int a = 10;                  修改後          int a = 10;

int* const p = &a;           -------------->       int* const p =&a;

int**q = &p;                                int * const*q =&p;

此時const修飾p 直接訪問:p 間接訪問(比直接訪問大一級或幾級的):*q 此時*q沒有被修飾 有修飾常量記憶體塊的風險 加上const即可杜絕

(4)特例!切記

int a = 10;                  修改後          int a = 10;

int*p = &a;               ---------------->       const int * p =&a;//方法二

const int**q =&p; //int**==>const int** 錯誤    const int*const*q = &p;//方法一

此時const修飾**q 直接訪問:a 間接訪問:從const起才看間接訪問 :**q 按理來說const 修飾了**q 應該沒問題 但這個**是錯誤的,其中**q還隱藏包含了*q這個間接訪問,首先來看這麼一行**

此時有兩種解決辦法

讓普通指標無法指向常量記憶體塊 也就是在*q前加const  此時變為const *q *q就是p 則此時*q不能儲存a的位址 無法指向a 那麼就更無法修改了

普通指標可以指向 但不能修改 此時變為const int* p 此時a不會修改了

因此不允許int**==>const int**(特例)雖說是許可權縮小 但是是錯誤的

(5)int a = 10;

int* p =&a;

int* const *q =&p;

此時const修飾*q 直接訪問:p 間接訪問:*q 有const修飾 所以正確

(6)int a = 10;

int*p =&a;

int** const q= &p;

此時const修飾q 直接訪問:q 間接訪問:無 間接訪問都沒有了 因此沒有修改常量記憶體塊的風險

4.const和引用的結合

const int&c =20(立即數 ,常量);

常引用可以引用立即數 立即數放到臨時量中 臨時量在記憶體上 常引用來引用臨時量

int a = 10;

const int&b = a;//const int == int 正確

引用不參與型別(忽略&) 指標參與型別

左運算元的許可權<=右運算元的許可權  特別要注意const int*<= int*

(1)int a = 10;

const int* p =&a;

const int* &q = p;//int*  const int* 錯誤 左運算元許可權大 所以在前面加const

(2)int a = 10;

int* const p =&a;

int* const&q = p;//int* int*const 錯誤 左運算元許可權大

(3)特例:

int a = 10;

const int*p = &a;

const int*const &q = p;//const int*  int*按理來說是正確 實際上錯誤 還有隱藏的q有修改常量記憶體塊的風險 和上面的特例一樣

5.引用和形參

形參加上const的作用:

(1)防止實參被修改

(2)引用立即數

引用作形參和普通變數作形參的區別:

(1)引用修改實參的值

(2)引用不能引用立即數 部分實參無法呼叫

6.引用 指標 和返回值的結合

不能返回區域性變數的位址或引用

有可能被呼叫函式清棧時有新的函式呼叫 此時main函式裡還儲存以前函式的位址 位址一直保留 根據位址會訪問  此時在呼叫新函式 新函式的值就會覆蓋以前的函式的值 此時根據位址訪問到的就是新的值 以前的值已經被覆蓋 所以會出錯

7.引用 指標來接收返回值時的使用

(1)int func()

int main()

(2)int* func()

返回值為int* 4位元組 凡是4位元組都由暫存器帶出 此時暫存器中存的是tmp的位址

int main()

(3)int& func()

引用底層是指標 返回的是tmp的位址 而且針對func() 系統都有自動解引用

int main()

6 引用型別 Object

1 例項化物件var obj new object var obj2 給物件設定屬性 obj2.name lc obj2.女 obj2.age 23 obj2 birthday 1994 03 13 obj2.say function 訪問物件的屬性或方法 console.log obj2.name...

C 學習(6) 引用

作用 給變數起別名 語法 資料型別 別名 原名 includeusing namespace std int main 引用一旦初始化,就不可以更改了 作用 函式傳參時,可以利用引用的技術讓形參修飾實參 優點 可以簡化指標修改實參 includeusing namespace std 交換函式 1....

C 學習隨筆(二) 引用

參考資料 1 搜狗百科 2 3 1 c 引用 c reference 是對c語言的重要擴充,引用的表示方法與定義指標相似,用 代替了 2 引用的概念及定義 引用宣告的方法 型別識別符號 引用名 目標變數名 或 型別識別符號 引用名 目標變數名 兩者的區別於指標中的類似 例如 int a int b ...