如何正確理解棧和堆?

前言

學過計算機的童鞋們都知道棧和堆,說實話大學的時候真沒好好聽講,也就知道個大概,今天就簡單的總結一下,淺談棧和堆,去了解一下我們平時定義變量的時候,在計算機中是怎麼存儲的。前端

什麼是堆和棧?

堆和棧實際上是兩種數據結構。堆棧都是一種數據項按序排列的數據結構,只能在一端(稱爲棧頂(top))對數據項進行插入和刪除。堆棧是個特殊的存儲區,主要功能是暫時存放數據和地址。
程序員

堆和棧什麼區別?

  • 棧(操做系統):由操做系統自動分配釋放 ,存放函數的參數值和局部變量的值等。其操做方式相似於數據結構中的棧。簡單的理解就是當定義一個變量的時候,計算機會在內存中開闢一塊存儲空間來存放這個變量的值,這塊空間就叫作棧,然而棧中通常存放的是基本類型數據,棧的特色是先進後出(或後進先出)
  • 堆(操做系統): 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收,分配方式卻是相似於鏈表。其實在堆中通常存放變量是一些對象類型

代碼中去理解棧和堆?

話很少說,我們先上一段簡單的代碼,本身去思考一下會打印出什麼結果而且爲何會打印這種結果?,在堆和棧中怎麼呈現的?,在看下面對應的解釋,這樣的話可能就更好的理解了。數組

//1
	var a = 10;
	b = a;
	b += 20;
	alert(a);
	
	//2
	var obj = {
		name : "jack"
	};
	b = obj;
	b.name = "Lily";
	alert( obj.name );
	
	//3
	var arr = [1,2,3];
	brr = arr;
	brr[0] = 10;
	alert( arr[0] );
	
	//4
	var a = 20;
	function fun(a){
		a += 30; 
	}
	fun( a );   
	alert( a );
	
	//5
	var arr = [1,2,3];
	function fun(brr){
		brr[0] = 20;
	}
	fun(arr); 
	alert(arr[0]);
複製代碼

上圖:bash


對着這張圖就能夠理解第一道題爲何會打印10了,當你聲明一個變量,計算機會在棧中給你開闢一個內存空間去存儲這個變量,當你去改變b的時候,那也只是去改變了b,因此a空間的值是不會受到任何影響,因此第一道題會打印出來10。數據結構

繼續上圖:函數



上面說了棧中存儲的是基本類型的數據,若是是數組,對象等這些呢?上面這個圖就能看出來,對應着第三道題看,若是定義一個arr = [1,2,3]。在棧中就會存儲一個地址,在堆中就會存儲對應地址的值,這個地址就會指向對應的數據,那這個地址在計算機中叫什麼呢?其實就是所謂的指針變量, brr = arr; 叫作地址傳值,你會發現brr在堆中是指向同一個位置,從而當你改變brr[0]的時候,arr[0]也是跟着改變了,因此第三那道題的答案也就出來了,再也不是1而是10;因此這種地址傳值也就稱其爲一改全改post

補充

上面提到的一改全改不知道你在真正開發的時候想到的了什麼,那就是深拷貝和淺拷貝的問題,在開發中會常常遇到這種問題,關於拷貝你能夠看看個人這篇文章,<--點這裏。spa

總結

以上講解自我感受通俗易懂,沒有太多華麗的語言,看的舒服看得懂纔是最重要的,若是你是作前端的,若是你是非計算機專業半道出家的我相信也是對你有多幫助的,固然還有更專業的講解。剩下得幾道題能夠本身去對着思考思考了,若是能幫到你更好的理解關於堆和棧,請給我一個小小的贊做爲鼓勵,我會更努力的寫文章。操作系統

相關文章
相關標籤/搜索