在 ListNode dummy(0);ListNode* cur = &dummy; 中,& 是取地址運算符,用來獲取變數 dummy 的地址。具體如下: ListNode dummy(0);:創建了一個類型為 ListNode 的對象 dummy,其值初始化為 0。 &dummy:取 dummy ...
在 ListNode dummy(0);ListNode* cur = &dummy;
中,&
是取地址運算符,用來獲取變數 dummy
的地址。具體如下:
ListNode dummy(0);
:創建了一個類型為ListNode
的對象dummy
,其值初始化為0
。&dummy
:取dummy
對象的地址。&
運算符用於獲取變數的記憶體地址。ListNode* cur = &dummy;
:聲明瞭一個指向ListNode
類型的指針cur
,並將其初始化為指向dummy
的地址。
在 ListNode* dummy = new ListNode(0); ListNode* cur = dummy;
中,dummy
是鏈表指針。具體如下:
ListNode* dummy = new ListNode(0);
:創建了一個類型為ListNode*
的鏈表指針dummy
,其值初始化為ListNode(0)
。new ListNode(0)
:實例化一個ListNode(0)
對象。ListNode* cur = dummy;
:聲明瞭一個ListNode
類型的指針cur
,並將其初始化為dummy
指針。
為什麼使用 &dummy
?
使用 &dummy
主要是為了簡化鏈表的操作。具體來說:
-
簡化鏈表操作:
dummy
是一個虛擬頭節點,它的存在使得我們不必處理鏈表頭部的特殊情況(比如在空鏈表上插入第一個節點,或者在鏈表頭部插入新節點)。- 通過使用
dummy
,所有插入操作都可以統一處理,不需要額外的條件判斷。
-
指針操作:
cur
是一個指針,用於遍歷和構建新鏈表。- 將
cur
初始化為dummy
的地址,這樣在向鏈表中添加第一個節點時,dummy.next
可以直接指向新節點,並且後續操作都可以通過更新cur
來進行。
區別
-
記憶體分配方式:
ListNode dummy(0);
是在棧上分配的記憶體。棧上的記憶體會在超出作用域時自動釋放。ListNode* dummy = new ListNode(0);
是在堆上分配的記憶體。堆上的記憶體不會自動釋放,需要手動調用delete
來釋放,防止記憶體泄漏。
-
指針的使用:
ListNode dummy(0); ListNode* cur = &dummy;
這裡dummy
是一個對象,cur
是指向dummy
的指針。ListNode* dummy = new ListNode(0); ListNode* cur = dummy;
這裡dummy
本身就是一個指針,指向堆上的ListNode
對象,cur
也指向同一個對象。
優缺點
在棧上分配記憶體
優點:
- 自動管理記憶體:函數退出時,棧上的記憶體會自動釋放,無需手動管理。
- 更快的記憶體分配和釋放:棧上的記憶體操作通常比堆上的快。
缺點:
- 生命周期受限:棧上的對象在函數返回後就被釋放,不適合需要在函數外部長期使用的對象。
在堆上分配記憶體
優點:
- 生命周期靈活:可以手動控制對象的生命周期,適合需要在函數外部長期使用的對象。
缺點:
- 手動管理記憶體:需要手動釋放記憶體,否則會導致記憶體泄漏。
- 相對較慢的記憶體分配和釋放:堆上的記憶體操作通常比棧上的慢。
在 C++ 中,.
和 ->
操作符用於訪問對象的成員:
.
操作符用於直接訪問對象的成員。->
操作符用於通過指針訪問對象的成員。
區別
dummy.next
:dummy
是一個對象,通過.
操作符直接訪問dummy
的成員next
。dummy->next
:dummy
是一個指向對象的指針,通過->
操作符訪問指針指向的對象的成員next
。
具體示例
棧上分配對象
ListNode dummy(0); // dummy 是一個對象
ListNode* cur = &dummy; // cur 是指向 dummy 的指針
cur->next = new ListNode(1); // 通過 cur 指針訪問 next 成員
ListNode* head = dummy.next; // 直接通過對象 dummy 訪問 next 成員
在這個例子中:
dummy
是一個ListNode
對象,可以直接使用dummy.next
訪問其成員。cur
是一個指向dummy
的指針,使用cur->next
訪問dummy
的成員。
堆上分配對象
ListNode* dummy = new ListNode(0); // dummy 是一個指向 ListNode 對象的指針
ListNode* cur = dummy; // cur 和 dummy 都是指向同一對象的指針
cur->next = new ListNode(1); // 通過 cur 指針訪問 next 成員
ListNode* head = dummy->next; // 通過 dummy 指針訪問 next 成員
在這個例子中:
dummy
是一個指向ListNode
對象的指針,需要使用dummy->next
訪問其成員。cur
同樣是一個指向ListNode
對象的指針,使用cur->next
訪問其成員。
總結
在使用棧上分配的對象時,使用 .
操作符訪問成員,因為我們直接處理的是對象本身。而在使用堆上分配的對象時,使用 ->
操作符訪問成員,因為我們處理的是指向對象的指針。