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

2021-04-13 08:17:09 字數 1717 閱讀 2624

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

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

#include

int main()

{int a=1;

int b=2;

int &c=a;

int *d=&b;

c=*d;

cout《反彙編**如下:

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...