引用與指標

2021-08-16 22:14:41 字數 3104 閱讀 4143

1.引用的概念及用法

引用不是定義乙個新的變數,而是給乙個已經定義的變數重新起乙個別名

定義的格式:型別 & 引用變數名 = 已定義過的變數名

引用的特點:

a)乙個變數可取多個別名

b)引用必須初始化

c)引用只能在初始化的時候引用一次,不能改變為再引用其他的變數

int& b = a;      //為一塊已開闢的空間a取名為b(b是a的別名)

int* p = &a; //p指向空間a

int a = 10;

int& b = a; //b是a的別名

int i = 100;

b = i; //單純將i的值賦給b,b任然是a的別名,而此時a=b=100

const

int a = 10;

int& b =a;

顯然此時編譯器會報錯,原因是變數a用const修飾,具有常性,不能被修改。而此時a的別名b型別是int,可被修改,發生衝突,程式編譯出錯

此時應該將int& b=a;改為const int& b = a;

類似的:

int& c = 20;            //這樣表示是錯誤的。常量具有常性,只有常引用可以引用常量

const

int& c = 20; //正確表示方法

int d = 10;

float e = d; //存在隱式型別轉換

float& f = d; //錯誤

const

float& f = d; //正確

2.引用做引數

void swap(int& a, int& b)

int main()

結果為:

顯然傳引用同樣可以起到修改實參作用,此時形參是引用型別,形參是實參的別名,並未給形參開闢空間。同樣的用傳位址的方法傳參也可以起到修改實參的作用,但此時需給形參開闢空間。

結論:①引用傳參可以減少空間浪費

②引用傳參可以提高效率

若實參不想被修改,則可以用const修飾形參

void func(const big& big)

3.引用做返回值

①傳值返回

int add(int a, int b)     //傳值返回

若用int& ret = add(10,20);則會發生錯誤,因為函式返回的是臨時變數,具有常性,必須用const修飾,應改為const int& ret = add(10,20);

②傳引用返回

int& add(int a, int b)

int main()

結果為ret = 3

4.彙編層看引用的特性

語法上b是a的別名(不開闢空間),但底層是通過指標實現的(開闢了空間)。

結論:

1.不要返回乙個臨時變數的引用。

2.如果返回物件出了當前函式的作用域依舊存在,則最好使用引用返回,因為這樣更高效。

5.引用和指標的區別

引用與指標的區別和聯絡

⑴引用只能在定義時初始化一次,之後不能改變指向其他變數(從一而終);指標變數的值可變。

⑵引用必須指向有效的變數,指標可以為空。

⑶sizeof指標物件和引用物件的意義不一樣。sizeof引用得到的是所指向的變數的大小,而sizeof指標是物件位址的大小。

⑷指標和引用自增(++)自減(–)意義不一樣。

⑸相對而言,引用比指標更安全。

注:32位系統下指標一定為4個位元組

64位系統下與編譯器配置有關,工程建立後決定了指標的大小

有關越界的小常識:

越界不一定報錯

越界讀一般不報錯

如:

指標與引用

摘自 高質量c 程式設計 指標與引用,在more effective c 的條款一有詳細講述,我給你轉過來 條款一 指標與引用的區別 指標與引用看上去完全不同 指標用操作符 和 引用使用操作符 但是它們似乎有相同的功能。指標與引用都是讓你間接引用其他物件。你如何決定在什麼時候使用指標,在什麼時候使用...

引用與指標

引用就是物件的另乙個名字,在實際的程式中,引用主要用作函式的形式引數。引用是一種復合型別,通過在變數名前新增 符號來定義。復合型別是指用其他型別定義的型別。在引用的情況下,每一種引用型別都 關聯到 某一其他型別。引用必須用與該引用同型別的物件初始化。當引用初始化後,只要該引用存在,它就保持繫結到初始...

指標與引用

include iostream using namespace std void testref int i 10 引用不可以為空,他是乙個物件的別名 int ref i ref cout i 00824f1e mov dword ptr i 1 把i的位址傳入eax 並把eax指標的位址傳給re...