C++链表插入节点函数为什么要传递头节点的二维指针
C++鏈表插入一個(gè)節(jié)點(diǎn)的代碼如下:
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)這個(gè)函數(shù)要傳遞頭結(jié)點(diǎn)的二維指針,傳遞頭結(jié)點(diǎn)的一維指針可以嗎?
不可以。因?yàn)楹瘮?shù)里可能會(huì)改動(dòng)頭指針。如果只是傳入頭結(jié)點(diǎn)的一維指針,那么只能改變頭結(jié)點(diǎn)所指的內(nèi)容,當(dāng)我們想改變頭指針本身(例如將頭指針由原來(lái)的p1指針換到p2指針,即把P2指針作為頭指針)時(shí)就無(wú)法實(shí)現(xiàn)了。但傳入二維指針則可以改變頭指針本身,例如上面代碼中的*pHead = pNew把pNew作為頭指針,由于pHead是二維指針,相當(dāng)于把pHead所指的內(nèi)容變?yōu)閜New。在函數(shù)里改變一個(gè)指針?biāo)傅膬?nèi)容,出了這個(gè)函數(shù)后這個(gè)改變還是生效的,所以退出函數(shù)后*pHead仍為pNew。
再來(lái)看看如果傳入函數(shù)的是頭結(jié)點(diǎn)的一維指針會(huì)怎么樣:即addListNode(ListNode* pHead, int value),在函數(shù)里面通過(guò)pHead = pNew把pNew作為頭指針,但這一句只是把函數(shù)里的pHead改變了,退出這個(gè)函數(shù)后,函數(shù)外的pHead本身并未發(fā)生改變。(相當(dāng)于函數(shù)值傳遞方式)
下面舉個(gè)類(lèi)比的例子加以說(shuō)明,證明傳遞頭結(jié)點(diǎn)的一維指針并不能改變指針本身的值
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; }在上面這個(gè)例子中,我把pHead這個(gè)一維指針傳入changeHead(int* pHead)函數(shù),在函數(shù)里把通過(guò)pHead = new_p把pHead本身改變?yōu)閚ew_p。可以看到函數(shù)里pHead所指的值為50,看似已經(jīng)把pHead改變?yōu)閚ew_p,但出了函數(shù)外面后,pHead所指的值還是100。所以函數(shù)里只能改變指針?biāo)傅膬?nèi)容,如果要改變指針本身的值,必須傳遞二維指針,才能使改變生效。
?
總結(jié)
以上是生活随笔為你收集整理的C++链表插入节点函数为什么要传递头节点的二维指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hadoop jar包_【大数据学习】H
- 下一篇: C语言的struct和C++的class