C++链表插入节点函数为什么要传递头节点的二维指针
C++鏈表插入一個節(jié)點的代碼如下:
struct ListNode {int m_value;ListNode * m_next; };void addListNode(ListNode** pHead, int value) {ListNode * pNew = new ListNode();pNew->m_value = value;pNew->m_next = NULL;if (*pHead == NULL){*pHead = pNew;}else{ListNode * pNode = *pHead;while (pNode->m_next != NULL){pNode = pNode->m_next;}pNode->m_next = pNew;} }那為什么addListNode(ListNode** pHead, int value)這個函數要傳遞頭結點的二維指針,傳遞頭結點的一維指針可以嗎?
不可以。因為函數里可能會改動頭指針。如果只是傳入頭結點的一維指針,那么只能改變頭結點所指的內容,當我們想改變頭指針本身(例如將頭指針由原來的p1指針換到p2指針,即把P2指針作為頭指針)時就無法實現了。但傳入二維指針則可以改變頭指針本身,例如上面代碼中的*pHead = pNew把pNew作為頭指針,由于pHead是二維指針,相當于把pHead所指的內容變?yōu)閜New。在函數里改變一個指針所指的內容,出了這個函數后這個改變還是生效的,所以退出函數后*pHead仍為pNew。
再來看看如果傳入函數的是頭結點的一維指針會怎么樣:即addListNode(ListNode* pHead, int value),在函數里面通過pHead = pNew把pNew作為頭指針,但這一句只是把函數里的pHead改變了,退出這個函數后,函數外的pHead本身并未發(fā)生改變。(相當于函數值傳遞方式)
下面舉個類比的例子加以說明,證明傳遞頭結點的一維指針并不能改變指針本身的值
void changeHead(int* pHead){int b = 50;int* new_p = &b;pHead = new_p;cout << *pHead << endl; //50 }int main(int argc, char* argv[]) {int a = 100;int* pHead = &a;changeHead(pHead);cout << *pHead << endl; //100return 0; }在上面這個例子中,我把pHead這個一維指針傳入changeHead(int* pHead)函數,在函數里把通過pHead = new_p把pHead本身改變?yōu)閚ew_p。可以看到函數里pHead所指的值為50,看似已經把pHead改變?yōu)閚ew_p,但出了函數外面后,pHead所指的值還是100。所以函數里只能改變指針所指的內容,如果要改變指針本身的值,必須傳遞二維指針,才能使改變生效。
?
總結
以上是生活随笔為你收集整理的C++链表插入节点函数为什么要传递头节点的二维指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hadoop jar包_【大数据学习】H
- 下一篇: C语言的struct和C++的class