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