C 語言初學教材 - 第六章 增加好友 結果說明

咦?為什麼會完全沒有顯示新加入的好友呢?我們重新檢視 main() 與 addfriend() 之間的關係,首先, main() 宣告了 startPtr 作為鏈結串列的起點,假設 startPtr 的記憶體位址為 address_a ,我們賦予初值為 NULL




呼叫 addfriend() ,把 startPtr 當成參數傳給 addfriend() ,由於 C 語言採用的是傳值呼叫,因此是把 NULL 拷貝過去,而在 addfriend() 中,假設參數 startPtr 的記憶體位址為 address_b



而後,我們宣告新節點的 newPtr ,假設記憶體位址為 address_c ,還沒指向任何結構 linkedListNode ,因此假設初值也為 NULL



當我們利用標準函數庫 stdlib.h malloc() ,作業系統給了我們新的記憶體空間,假設位址為 address_d ,這時注意, newPtr 指向這個新的記憶體空間,因此 newPtr 所儲存的值變成 address_d



因為這是第一個新的節點,我們同時將參數 startPtr 的值設定為 address_d



也就是說,程式執行到這裡,記憶體位址在 address_b 、 address_c 的變數都是儲存 address_d 的值。可是這樣影響不到函數 main() 中的 startPtr ,因為 startPtr 的記憶體位置在 address_a



我們在這個例子中加入印出 main() 中 startPtr 的記憶體位址,更可以看出只是傳遞指標函數,也就是傳遞某個記憶體位址給其他函數,由於 C 語言傳值呼叫的特性,因為都是把變數的值,這裡就是指標變數的值拷貝給 addfriend() ,拷貝後參數的值並不會影響原函數作為呼叫的變數值。


完整的範例程式碼及編譯執行,請參考


嗯,結果都是 0x0 ,因為都是 NULL ,還在想有些前輩高手耳提面命的傳址呼叫嗎?下一個部份我們會做進一步的解釋。




沒有留言: