C 指標和引用

2021-09-28 11:29:56 字數 2124 閱讀 4259

引用的概念及用法 

所謂的引用並不是說重新定義的乙個新的變數,而是給乙個已經定義好了的變數起的乙個別名。 

下面看看引用到底是如何使用的:

void test1()

//現在的我們都知道了這樣的函式是無法完成我們希望的交換功能的。

//究其原因,就是因為這裡使用的是傳值方式,那麼如果別人一旦想要

//呼叫我給我傳兩個引數,我就要生成兩個區域性的臨時變數用來接收

//別人給我傳的兩個引數。但是當呼叫結束,函式棧幀釋放,相應的

//用於接收引數的兩個區域性變數也會被一同釋放掉,但是交換是發生在

//這兩個區域性變數之間的,現在他們已經被釋放掉了,並且從頭到尾

//都沒有對呼叫方的兩個想要交換的變數產生任何影響。因此這裡的

//傳值呼叫並完成不了交換的功能。

2、傳址呼叫

void swap(int *a,int *b)

//所謂的傳址呼叫就是傳指標。

//現在我們將兩個形參改為指標,也就是說別人想要呼叫我完成交換功能時

//就將想要交換的兩個變數的位址傳給我就好了。函式呼叫期間對位址裡面

//的內容進行交換,即便呼叫結束以後,函式棧幀被釋放,但是是對兩個位址

//的內容進行了交換,釋放棧幀以後這兩個位址並不是函式棧幀裡的,

//所以並不會一併被釋放,並且完成了交換的功能。

3、傳引用

void swap(int& a,int& b)

//我們知道引用變數就是我們給乙個已經定義好的變數起的乙個別名,

//所以說,如果我們這裡採用傳引用的方式,那我們這裡的形參就是實參的別名

//在剛剛我們也看了,變數和變數的別名,他們兩個的位址是同乙個,所以啊,

//這和傳址呼叫有著異曲同工之妙。

引用做返回值

有時候我們乙個函式呼叫結束需要返回一些資訊供呼叫方使用。比如說乙個加法函式。

//方法一

int add(int a,int b)

//方法二

int& add(int a,int b)

//這裡方法一是採用值的形式返回,而方法2是採用引用的形式返回。

//我們可以看看組合語言是如何這兩種不同返回方式的,如下圖:

那麼問題來了,我們有該如何選擇以那種方式返回呢???

1、如果返回的物件出了該函式作用域依舊存在,則使用引用返回,因為這樣會更加高效 

2、如果返回物件處了函式的作用域就不存在了,則使用值返回。 

注意:不要返回乙個臨時變數的引用,因為臨時變數在函式呼叫結束以後會隨著棧幀的釋放而被釋放,而傳引用返回的方式返回的是變數的位址,而事實是該變數已經被釋放。

引用和指標的區別 

在這之前我們一直在說,引用是乙個變數的別名,所以可能就會想到說這個引用變數時不會佔據任何的空間的。但是!請注意!這種想法是不對的。引用變數也是會佔據一定的記憶體空間的,也需要在棧上額外占用儲存空間。 

因為引用的底層實現其實是指標。從語法上來看只是乙個別名,但在底層上依舊是開闢了一塊空間。

int main()

看一下這段**的彙編:是如何處理變數a,和引用變數b 

從彙編我們可以看出對引用變數初始化為a的別名,就是將a的位址給了引用變數b。想一想這種方式是不是很熟悉?對了,正如你所想到的我們經常寫的乙個**:

int a = 0;

int *p = &a;

//取a的位址賦給指標變數p

這樣看來其實引用的底層也就是乙個指標,只不過明面上向我們所展示的是乙個變數的別名,但我們應該注意引用變數是乙個已經定義過的變數的別名,他是別名,他也佔空間,因為他的底層實現是指標。

下面就看一看引用和指標的區別:

1、引用只能在定義時初始化一次,之後不能改變指向其他的變數,但指標可以。 

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

3、sizeof引用得到的是所指向的變數的大小,但sizeof指標是物件的位址的大小。 

4、引用的自增(+ +)自減(- -)是對值的+1或-1,而指標++或–是+或-其所指向的型別大小。

C 指標和引用

在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...

C 引用和指標

引用和指標看上去差不多,看上去差不多,其實男寶寶和女寶寶是不一樣的 用起來還是有一定差距。本人菜鳥僅將遇到的問題記錄備案,以便日後翻查 ptrfunc.h ifndef ptrfunc h define ptrfunc h typedef int func int,int struct aa end...

C 指標和引用

有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能 到目前為止我們介紹過函式引數傳遞的兩種情況 1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的 如果在執行函式期間形參的值發生變化,並不傳回給實參 因為在呼叫函式時,形參和實...