C 鍊錶插入節點函式為什麼要傳遞頭節點的二維指標

2021-10-17 01:29:12 字數 1003 閱讀 2220

c++鍊錶插入乙個節點的**如下:

struct listnode

;void addlistnode(listnode** phead, int value)

else

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 main(int argc, char* ar**)

在上面這個例子中,我把phead這個一維指標傳入changehead(int* phead)函式,在函式裡把通過phead = new_p把phead本身改變為new_p。可以看到函式裡phead所指的值為50,看似已經把phead改變為new_p,但出了函式外面後,phead所指的值還是100。所以函式裡只能改變指標所指的內容,如果要改變指標本身的值,必須傳遞二維指標,才能使改變生效。

C 為什麼要引入成員函式?

問題引入 程式設計提示使用者輸入圓的半徑,計算輸出圓的面積 include include intmain void 物件導向首先需要對問題進行抽象,定義乙個描述圓的資料型別,再建立具體的圓物件。在c語言中,可以定義乙個結構體struct,用來包含圓的半徑等資訊,而c 中稱為類class。類和結構體...

鍊錶為什麼刪除插入快!陣列為什麼查詢快!

1 它是具有相同資料型的資料,並且有一定的順序,陣列在記憶體中的位址是連續相鄰的。而鍊錶在記憶體中是雜湊存放的。2 cup快取會把一片連續的記憶體空間讀入。因為陣列結構是連續的內村位址,所以陣列全部或者部分元素被連續被存在cpu快取裡面,而鍊錶的節點是分散在堆空間裡面的,這時候cpu快取幫不上忙,只...

C語言鍊錶節點插入與刪除

順序表是我們資料結構中的基本儲存形式,現在給定乙個順序表,有如下操作 insert x y 在順序表中x位置插入y元素,遍歷輸出當前順序表的所有元素。delete x 刪除順序表中的x元素,如果有多個x元素,只刪除第乙個x,遍歷輸出當前順序的所有元素。locate x 輸出順序表中x元素的所在的位置...