1 內存單元的地址、值屬性
程序的代碼和數據要存儲到內存才可以被執行。內存單元同時具有地址屬性和值屬性。
地址屬性:每一個字節(8個位)都有一個內存地址對應,變量名就是對地址的命名,讓其更好理解、記憶和使用;
值屬性:一串的0、1二進制,按數據類型確定其長度和解碼方案;
2 普通、指針、引用變量對地址、值屬性的顯式、隱式使用
普通、指針、引用變量的區別在于對地址、值屬性的顯式、隱式使用的方式不同:
3 引用的本質是一個實現的自動解引用指針常量
引用可以理解為其引用的變量的別名,但本質是一個實現的自動解引用指針常量。
在函數定義中,引用在形參在聲明時,顯式使用地址屬性,類似指針變量的使用。在函數體中,顯式使用變量(別名)的值屬性,類似于普通變量,因為由編譯器實現了自動解引用。
引用的常量屬性,必須在聲明時初始化(也就再沒有機會做其它變量的別名或引用了),也因為其具有自動解引用的屬性,聲明(包括初始化)以外的使用都是顯式對應其指向的地址的值的引用(相當于直接使用其引用(或指向)的普通變量)。
因為這些屬性,相對于指針,引用更安全,使用更簡潔。當然,引用不能替代指針,指針有自己的使用場合,特別是當其不斷需要變更指向時。
#include <iostream>using namespace std;void swap(int& a,int&b){ int t; t=a; a=b; b=t;}void main(){ int i=3; int j=5; swap(i,j); cout<<i<<","<<j<<endl; system("pau");}
引用占用內存空間嗎?
看下面的小實例:
#include <iostream>using namespace std;void main(){ int j=3; int var=4; int* p = &var; int& f = var; int i = 5; cout<<&j<<endl; cout<<&var<<endl; cout<<&p<<endl; cout<<&f<<endl; cout<<&i<<endl; system("pau");}/*0012FF440012FF400012FF3C0012FF400012FF34/*
上面定義了上述各種類型的變量,因為都是局部變量,被分配在棧空間,因為定義在一起,其地址也應該是緊鄰在一起的,上面的int& f = var; 引用變量f也是夾在中間,如果不占用空間的話,其前面與后面變量的地址所相關的數量應該是前面變量類型的長度,
int* p = &var; int& f = var; int i = 5;
32位計算機中,p的長度是4,地址是0012FF3C,0012FF3C-4=0012FF38,但i的地址是0012FF34。所以,其實質是占用了一個指針長度的內存空間,但用求址運算符"&“求出的卻是其別名的地址,其本身的地址是隱藏的。
4 函數的值傳遞、指針傳遞、引用傳遞
程序的數據始終需要在共享與相對獨立、內聚與耦合之間取舍。類的封裝與訪問屬性的控制以及友元的語法機制就是如此,函數也是面向過程的封裝,函數之間可以相互調用,其數據的共享與相對的獨立性的取舍就用了值傳遞、指針傳遞、引用傳遞的語法機制。
值傳遞是為了實現函數之間的相互獨立性,被調用函數對調用函數來說,我是值傳遞,我只用你的變量的值(實參),由編譯器在棧內幫我找一塊內存單元(用形參命名,如果是自定義類型,可能需要一大片內存空間),你只要把變量的值傳遞進去,此后,實參與形參對應各自的棧空間,彼此不相關,相互獨立。獨立是獨立了,但賦值是需要時間的,是有性能損耗的,另外,另外的空間也是一種浪費。
指針傳遞破壞了上述的獨立性,但實現了數據的共享,有了時間和空間上更高的效率,讓參數有了輸出的功能。被調用函數對調用函數來說,我是指針傳遞,編譯器不會再在棧內開辟內存空間來存儲你的變量(實參)的值了(只需用一個字長的空間來保存一個地址值),我們共享、共同使用你的用做實參的變量的空間,這樣沒有時間和空間的浪費。
引用傳遞和指針傳遞都是址傳遞,都是數據共享,只是引用相對來說,在特殊的場合下,如上面所說的,更安全(因為其地址屬性的使用只有一次的機會)、更簡潔(定義后無須解引用即使用其引用的變量(別名)的值,不然為什么叫引用呢?)。
函數可以返回值,也可以返回地址,返回值與傳遞值也有一個相同的地方,也是另行使用一個棧上的內存空間,建立一個臨時對象保存這個值(如果是自定義類型,可能需要一大片內存空間)。返回地址也是只保存了一個地址值。需要注意的是,不要返回局部變量的地址值,因為出了這個被調用函數,其局部變量的地址值已不可見了。
需要注意的是,實參與形參的結合以及函數返回,會有隱式類型轉換的問題。
-End-
本文發布于:2023-02-28 20:13:00,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/167766393282080.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:內存地址(內存地址是什么).doc
本文 PDF 下載地址:內存地址(內存地址是什么).pdf
| 留言與評論(共有 0 條評論) |