引用與指標的區別
說起引用和指標,相信大多數人都或多或少的有些許疑問吧,小編來給大家小解一下,講的不好請使勁拍磚,小編承受能力極強,不信你試試。
先談一下為什麼有了高效的指標還要引入引用呢?
有過學C語言的同學都知道指標的重要性,它高效靈活,但是實物都有兩面性,高效靈活則意味著容易出錯。對於一個指標,它所指向的物件是靈活的,他可以指向任何一個與它型別相匹配的物件,這一刻它指向物件1,下一刻就有可能指向另一個物件2,這就容易引發安全隱患,如將一個自己定義的指標指向一個系統物件,一旦你對該指標進行操作,就有可能引起系統崩潰,還有就是野指標和未初始化的指標都有安全隱患,為了解決在一定程度上彌補指標的缺點,就引入了指標,注意引用這一概念在C語言中使沒有的,在C++、C#中有,其它語言有沒有小編就不清楚了。
引用:在實際程式設計中引用主要用做函式的形式引數,它其實就是一個物件的別名,它在定義的時候必須要初始化,這一點與實際生活中給小夥伴起外號是一樣的,你是看人(相當於物件)來起外號(相當於引用),而不是先想外號再找人,並且一旦初始化之後,該引用就只能指向所關聯的物件了,不能再指向其它物件了,就像現實中的你只能有一個合法老婆一樣,對引用的所有操作都相當於對所關聯物件本身的操作。其中const 引用需要你關注。
對於非const引用,用於初始化引用的必須是一個與該引用同型別的物件,不能是一個常量
int a;
int &s=a; //ok
int &j=12; //error
對於const引用,則可以繫結到不同但相關的型別的物件或繫結到右值。
繫結到右值的情況如下:
int i=43;
const int &r=43; //合法
const int &r2=r+i; //合法
繫結到相關型別的物件如下:
double dval=3.14;
const int &ri=dval; //合法
其實編譯器會把上述程式碼轉換成如下形式的編碼:
int temp=dval; //建立一個臨時的變數
const int &ri=temp; //其實繫結到了一個臨時變數物件上,對ri 的操作不會改變dval
指標:指標實際就是地址,是標識一塊記憶體的一個標識,通過這個標識可以對所指向的記憶體中的資料進行操作,指標儲存在對應型別的指標變數中,注意野指標和未初始化的指標會帶來安全隱患,養成良好習慣,定義指標變數時要對其初始化。指標的用處用很多,需要多加學習。
總結一下指標與引用的區別:
1、引用定義的時候必須初始化,而指標不是必須的,但習慣上要進行初始化
2、引用一旦初始化之後,就只能指向初始化的物件,不能再另指向其他物件了,但指標可以
3、都可以通過自身來直接操作指向的物件
相關文章
- C/C++引用和指標的聯絡和區別C++指標
- C++引用與指標的比較C++指標
- 詳解c++指標的指標和指標的引用C++指標
- const指標的引用指標
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- C++ 指標陣列與陣列指標的區別C++指標陣列
- 指標常量和常量指標的區別指標
- C++指標與引用的區別C++指標
- 指向指標的常量引用瞭解指標
- 指標和引用的區別指標
- 【C++系列】指標物件和物件指標的區別C++指標物件
- C++引用比指標的好處C++指標
- C語言:陣列和指標的區別C語言陣列指標
- C: (pointer) 陣列變數和指標的區別陣列變數指標
- golang中 值型別,指標,引用的區別Golang型別指標
- 物件與物件引用的區別物件
- 值型別與引用型別的區別型別
- JAVA 基本型別與 引用型別區別Java型別
- 指標與引用指標
- All I know about A/B Test (1) : 均值型指標與比值(率)型指標的計算區別指標
- Java中方法引用與Lambda區別 - foojayJava
- C++中引用傳遞與指標傳遞區別(進一步整理)C++指標
- 指向指標的指標指標
- 指標的理解指標
- 指標的用法指標
- 指標 與 陣列 以及 a 與 &a的區別指標陣列
- Python引用型別和值型別的區別與使用Python型別
- C++ 引用計數技術及智慧指標的簡單實現C++指標
- 強引用、軟引用、弱引用、幻象引用有什麼區別?
- 空指標的救星指標
- 型別的本質:對變數、型別、指標的理解型別變數指標
- 如何理解指向指標的指標?指標
- C++與Rust操作裸指標的比較C++Rust指標
- Java關於空指標的防範與思考Java指標
- [C++ Daily] 虛表與虛指標的理解C++AI指標
- C++中的指標與引用C++指標
- 字串指標的輸出字串指標
- 空指標的傳說指標