第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 ...