c 中引用和指標的內部實現

2021-08-26 08:04:34 字數 1330 閱讀 9508

c++中,引用和指標時比較讓人混淆的。它們的外在區別想必很多人都知道。在這我再重複一下。

引用在定義時必須初始化,即該引用所引用的必須時確實存在的變數,不能為null。而指標就沒有這個限制。有人說,引用就相當於乙個變數的別名,對該引用所做的操作就相當於對原變數一樣。我不太認同這個看法。在內部實現上,其實引用也是通過位址實現的。因此我更想稱引用為一種特殊的指標。讓我們看看下面這個簡單的例子。

#include

int main()

反彙編**如下:

1: #include

2:3: int main()

4: {

00401040 push ebp

00401041 mov ebp,esp

00401043 sub esp,50h

00401046 push ebx

00401047 push esi

00401048 push edi

00401049 lea edi,[ebp-50h]

0040104c mov ecx,14h

00401051 mov eax,0cccccccch

00401056 rep stos dword ptr [edi]

5: int a=1;

00401058 mov dword ptr [ebp-4],1

6: int b=2;

0040105f mov dword ptr [ebp-8],2

7: int &c=a;

00401066 lea eax,[ebp-4] !注意這裡,把ebp-4賦給eax,ebp-4即為變數a的位址

00401069 mov dword ptr [ebp-0ch],eax !把eax 儲存在ebp-0ch這個位置,ebp-0ch為引用c的位置

8: int *d=&b;

0040106c lea ecx,[ebp-8]

0040106f mov dword ptr [ebp-10h],ecx !這兩行和上面的兩行是一模一樣的

9: c=*d; !把b 的值賦給c

00401072 mov edx,dword ptr [ebp-0ch] !把a的位址給edx

00401075 mov eax,dword ptr [ebp-10h] !把b的位址給eax

00401078 mov ecx,dword ptr [eax] !把b的值給ecx

0040107a mov dword ptr [edx],ecx !把ecx 即b的值給a,c引用的還是a

10: cout<

可見,在內部實現上,引用和指標是一模一樣的,對引用的更改,就是把引用所指的變數重新賦指,引用本身並沒有更改。

c 中引用和指標的內部實現

c 中,引用和指標時比較讓人混淆的。它們的外在區別想必很多人都知道。在這我再重複一下。引用在定義時必須初始化,即該引用所引用的必須時確實存在的變數,不能為null。而指標就沒有這個限制。有人說,引用就相當於乙個變數的別名,對該引用所做的操作就相當於對原變數一樣。我不太認同這個看法。在內部實現上,其實...

C 中的指標和引用

注意本人的部落格都遷移到本人自己搭建的部落格位址,通過此處可檢視。本人在工作之餘學習c 但是可能在訓練過程種,會通過各種刷題的形式去提公升自己,但是這樣在一些公司 尤其是大廠 面試的時候會很尷尬。而c 種的指標和引用有什麼區別和聯絡呢,現在就來說道說道,如有錯誤,敬請大家指正。首先我們來說道說道指標...

c 中的指標和引用

首先 指標是儲存的變數的位址,引用是變數的別名,這個必須記住 單純的給變數取別名沒有任何的意義,作為引數傳遞,能保證引數傳遞過程中不產生任何的副本 引用可以直接操作變數,但指標的話必須通過 p 間接的操作變數,指標可讀性行比較低 引用必須要有初始值 int a 常量必須要有初始值 const int...