【C++】 ——指針和引用的區別、數組和鏈表的區別

1、指針和引用的區別

都是地址的概念,指針指向的是一塊內存,它的內容是內存的地址,但是引用是一塊內存的別名。
區別:

  • 指針是一個實體,但是引用僅僅是別名
  • 引用使用時,無需解引用(*),但是指針需要解引用
  • 引用只能在定義的時候被初始化一次,之後不可改變,但是指針可變
  • 引用沒有const,但是指針有const
  • 引用不能爲空,但是指針可以爲空
  • sizeof引用的時候得到的是所指向變量(對象)的大小,但是sizeof 指針得到的是指針本身(變量或者對象的地址大小)的大小
  • 從內存分配上來看:程序爲指針變量分配內存區域,而引用不需要分配內存區域

2、數組和鏈表的區別

1)數組在內存中是逐個存放的,也就是說倘若數組的第一個元素在地址A,則第二個元素就是A+1,但是鏈表不一樣,鏈表每個節點沒有相對固定的位置關係,鏈表每個節點的內存是不連續的,某個節點在地址A,其後的結點不一定是A+1,而是在內存的其他空閒區域,呈現出一種隨機狀態

2)數組一旦被顯示聲明後,其大小就固定了,不能進行動態擴充,但是鏈表可以,可以動態生成節點並且添加到已有的鏈表後面

3)鏈表靈活,但是空間和時間額外耗費較大,數組大小固定,元素位置固定,但是操作不靈活,容易浪費空間,但是時間耗費較小,尤其是元素變化不大的時候效率恆高。雙向鏈表比單向更靈活,但是空間耗費也很大

4)對於增刪查改操作,數組在插入和刪除數據時候的效率較低,插入數據時,需要將插入位置之後元素的位置向後移動,刪除元素的時候,需要將這個位置之後的數據向前移動,但是隨機讀取的效率很高。而鏈表增加和刪除數據很容易,因爲不具有隨機訪問性,所以在訪問某個節點的時候都需要從頭開始順序訪問,直到找到需要查找的元素。

3、malloc和new的區別

  • maolloc和free是C++/C語言的標準庫函數new/delete是C++的運算符,他們都可以用於申請動態內存和釋放內存。
  • 對於非內部數據類型的對象來說,光用malloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不再編譯器控制權限之內,不能夠吧執行構造函數和析構函數的任務加於malloc/free
  • new可以認爲是malloc加上構造函數的執行new出來的指針直接帶類型信息的,但是malloc返回的都是void指針
  • malloc是底層的,new的實現是調用了malloc來實現堆內存的統一管理,所以我們可以認爲ne是maloc的擴展通跟班,而且但從內存分配的功能來說,他們是在同一塊內存區域實現統一管理。

4、什麼是內存泄漏?怎樣避免內存泄漏?

內存泄漏是指程序中已經分配的堆內存由於某種原因,程序未釋放或者無法釋放,造成一個系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果
怎樣避免內存泄漏?
良好的編程習慣,儘量在設計內存的程序中,檢測出內存泄漏,當程序穩定之後,再來檢測內存泄漏一定會增加排除的困難和複雜度。使用內存分配函數,一旦使用完畢,要記得使用相應的函數釋放掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章