C/C++配列とポインタおよび参照の違い

1479 ワード

C/C++配列とポインタおよび参照の違い
1.配列とポインタの違い
(1)定義
配列はシンボルであり、変数ではないため、自分で対応する記憶空間がありません.ただし、ポインタは1つの変数で、中に格納されている内容は別の変数のアドレスであり、変数であるためポインタには独自のメモリ空間がありますが、中に格納されている内容は特殊です.
(2)区別
a.宣言と定義については、ポインタと配列が異なり、配列として定義されている場合、宣言も配列であるべきであり、b.を下付きオペレータとして混同してはならない場合、ポインタと配列は等価である.a[i]はコンパイラによって*(a+i)に翻訳される.c.配列宣言が関数パラメータとして使用される場合、配列は実際にポインタとして使用されます.
(3)アセンブリ角度から分析

**int i = 10;**
00C44CC8 mov     dword ptr [i],0Ah 
**int * p = &i;** (1)
00C44CCF lea     eax,[i] 
00C44CD2 mov     dword ptr [p],eax 
**int arr[5] = {0};**(2)
00C44CD5 mov     dword ptr [arr],0 
00C44CDC xor     eax,eax 
00C44CDE mov     dword ptr [ebp-30h],eax 
00C44CE1 mov     dword ptr [ebp-2Ch],eax 
00C44CE4 mov     dword ptr [ebp-28h],eax 
00C44CE7 mov     dword ptr [ebp-24h],eax 

説明:
(1)leaはiのアドレスを先に取り,pが指す空間に格納し,pに独自の空間があることを証明するのに十分である.
(2)配列明に空間を割り当てていない
2.配列と参照の違い
(1)定義
リファレンスは変数に別名を付け、リファレンスを初期化する必要があります.リファレンスの定義は変更できません.初期化の値はアドレスを取得し、リファレンス変数にアクセスし、リファレンス変数のメモリに永遠にアクセスする必要があります.
(2)区別
C言語には参照はありません.C++11の前には1レベルの参照しかありません.その後、左参照と右参照があります.
(3)アセンブル角度

**int i = 10;**
00ED4CBE mov     dword ptr [i],0Ah 
**int &a = i;**
00ED4CC5 lea     eax,[i] 
00ED4CC8 mov     dword ptr [a],eax 


もし疑問があれば、伝言を残してあるいは当駅のコミュニティに行って討論を交流して、共に進歩して、読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!