一、指針與引用的區別程序員
從四個方面出發考慮不一樣點緩存
(1)從定義出發,指針是一個變量,所存內容爲指向變量在內存中的存儲地址;而引用只是原變量的一個別名,和原變量佔同一個存儲單元。數據結構
(2)初始化:指針能夠初始化爲NULL,能夠改變指向的內容;而引用不能夠,在使用時必須初始化,且初始化後不能改變。函數
(3)使用:在使用時,指針能夠多級(**p),而引用只能一級;引用使用時無需解引用(*),指針須要解引用。spa
(4)大小:"sizeof引用"獲得的是所指向的變量(對象)的大小,而"sizeof指針"獲得的是指針自己的大小指針
2.堆和棧的區別對象
2.1 概念內存
堆、棧是一種數據按序排列的數據結構。編譯器
在一個由C/C++編譯的程序佔用的內存分爲四部分:棧區、堆區、靜態存儲區、代碼區。編譯
2.2 區別
(1)堆棧空間分配
棧:由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。
堆:通常由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收。在運行時動態分配內存。
(2)堆棧緩存方式
棧:一級緩存,使用完當即釋放。
堆:二級緩存
(3)堆棧數據結構區別
棧:棧是一種後進先出的數據結構。
堆:能夠當作是一棵樹。
(4)申請大小的限制
棧:棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意
思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有
的說是1M,總之是一個編譯時就肯定的常數),若是申請的空間超過棧的剩餘空間時,將
提示overflow。所以,能從棧得到的空間較小。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲
的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小
受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。
可是容易產生碎片。