C++链表插入一个节点的代码如下:
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所指的内容变为pNew。在函数里改变一个指针所指的内容,出了这个函数后这个改变还是生效的,所以退出函数后*pHead仍为pNew。
再来看看如果传入函数的是头结点的一维指针会怎么样:即addListNode(ListNode* pHead, int value),在函数里面通过pHead = pNew把pNew作为头指针,但这一句只是把函数里的pHead改变了,退出这个函数后,函数外的pHead本身并未发生改变。(相当于函数值传递方式)
下面举个类比的例子加以说明,证明传递头结点的一维指针并不能改变指针本身的值
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本身改变为new_p。可以看到函数里pHead所指的值为50,看似已经把pHead改变为new_p,但出了函数外面后,pHead所指的值还是100。所以函数里只能改变指针所指的内容,如果要改变指针本身的值,必须传递二维指针,才能使改变生效。