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







































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 ,還在想有些前輩高手耳提面命的傳址呼叫嗎?下一個部份我們會做進一步的解釋。












沒有留言:




















window.___gcfg = { 'lang': 'zh-TW' };





Popular posts from this blog

迅雷 Thunder 7.9.43.5054 免安裝版 (9.1.41.914 安裝版) - 支援BT下載的萬用 檔案下載工具

qBittorrent 4.1.1 免安裝中文版 - 取代uTorrent的BT下載器

Nhiều đồn đoán cho rằng bộ đồ "phá vỡ quy tắc" của Meghan Markle được lấy cảm hứng từ trang phục của Công nương Diana