C 指標和引用

2021-10-24 09:18:15 字數 1442 閱讀 9880

什麼是指標,指標就是儲存了記憶體位址的整數,由於計算機記憶體是線性的,想象計算機記憶體是一條街道,街道上的房子排成一列,而每個房子都有乙個編號,而指標就是儲存了該編號,另外每個房子就代表計算機記憶體的乙個位元組大小。知道資料在記憶體的編號,後續才能進行讀寫操作,但還有重要的一點,如果已經有要操作的位址,但是不知道要操作多少位元組,這個時候型別就起作用了,所以type只是為了簡化程式設計所想出來的概率,它本身沒有實際意義,因為無論是整型指標還是浮點數指標,該指標都儲存了乙個整數表達的位址,而定義型別則是為了方便進行讀寫,以及指標的運算,向前一步,就不是移動乙個位元組,而是移動定義的型別所需的位元組數。

指標前面的型別定義只是為了說明在運算元據時操作多少個位元組的數,如果是指向指標的指標,那麼操作的就是整數,因為指標就是乙個整型變數,如果32位機器,就是乙個占用四位元組的整型變數。

引用相當於是乙個語法糖,擁有和指標類似的功能,同時**易讀性更高。

int a=3;

int& ref=a;

ref=3;

引用本身不是乙個變數,即程式執行的時候不會建立變數ref,即不會佔據記憶體空間,相當於是對變數取乙個別名,在任何想要用到變數a的地方都可以用ref替代,但是我們在使用ref時候把它當作變數一樣在使用。

這種語法糖功能在函式傳位址時更明顯。

以上這段話非常常見,但這是錯誤的,錯誤的!!!!!!引用在底層實現是乙個指標常量,一旦指向某個記憶體,就不允許改變指向,同時必須在被建立時初始化,這些指標常量的性質對於著下面這些引用必須帶有的性質!!!

不存在空引用,必須引用已經存在的變數。

一旦引用被初始化,引用物件就不能更改。

引用必須在建立時被初始化

引用雖然在底層實現是指標常量,但是編譯器做了很多假象,讓人們以為引用是別名的情況,

比如你無法獲得引用的位址,執行以下**時候

double a=

4.2;

double

& b=a;

cout<<

sizeof

(b)<<

sizeof

(a)<

//8cout<

//4

如果引用是指標的話,其位元組應該是4啊,但是這裡返回是8,這都是編譯器的假象

針對以下**檢視反彙編

可以清晰的看見的確存在乙個dword型別指標 r,其值是變數a的位址,通過eax暫存器存放

而針對引用在取引用,其反彙編對應的是把r存放的內容,即a的位址再次給了指標b

C 指標和引用

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

C 引用和指標

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

C 指標和引用

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