C 語言進階學習:工程師必學的「指標」— Udemy 課程心得

by 好豪
Published: Last Updated on

Advanced C Programming: Pointers 這門 Udemy 課程,教學指標、記憶體位址、與記憶體分配的重要概念,有將近 4 小時的影片講解,上完這門課可以讓你徹底理解 C 語言的指標。

這門課 的講解讓我覺得 C 語言的指標並不如想像中困難,我上完課也很快就體驗到學會指標的好處。在這則筆記,我將分享軟體工程師為什麼有必要學習指標、這門 Udemy 課程的特色、以及我在這門課的收穫。

請注意:這門課 不適合完全初學 C 語言的學生,你至少需要寫過任何一點 for loop 或 function。如果你學過 C、又認為自己忘記大部分內容了,推薦你到 這個網頁 用不到一個小時快速複習就好,不需要太熟、也可以直接開始上課。

為什麼要學 C 語言?

如果問高手為什麼要寫 C 語言,理由通常會是追求更佳效能。而我自己想學好 C 語言的理由則很單純:

為了強化電腦科學知識!

精通高階程式語言只是軟體工程師技能的其中一環而已,只懂寫 Python 而不懂電腦系統如何運作、怎麼能自稱工程師!為了在本業的資料科學之上、持續提升自己的軟體工程能力,筆者好豪習慣於自學作業系統、計算機結構、以及資料結構,學習這些電腦科學知識的根基都是 C 語言,因此,掌握 C 語言是必要的

C 語言是中階語言(Middle-Level Language),複雜度介於組合語言(Assembly Language)與高階語言(例如 Python)之間,做練習專案的時候如果碰到 UnixLinux 這些以 C 語言開發的作業系統,對 C 語言不熟悉的話是學不下去的!

此外,使用 C 語言可以直接操作記憶體(Virtual Memory),對於深入理解資料結構也有很大的幫助。而這項好處,上完 這門 Udemy 課程 的 C 指標資料結構實作章節之後,馬上就會體驗到。

課程特色

這門課 主打指標(Pointer)教學,你或許會想:有必要整門課都在講指標嗎?

筆者好豪平時會在程式解題網站 Codewars 上練習 C 語言,推薦你看一眼 這題這題,這些題目明明都被分類為「簡單」,但是,如果指標觀念不清楚,就完全無法解題!

關於指標,你需要懂的一切

這是一門由淺入深專注介紹指標的課程,前半段會詳細講解指標與記憶體的關係、後半段才是應用。指標的教學內容包括:

  • *& 符號的意義
  • Array 與 Pointer 的差異
  • Pointer to Pointer (Double Pointer)
  • main() 的參數 int argc, char *argv[]
  • Function Pointer 與 Callback Function
  • malloc()calloc()ralloc()free()

只看這些課綱就頭暈了嗎?要成為夠格的工程師,不論它們看起來再怎麼麻煩都得面對。筆者在滑 PTT 的時候,看到網友分享 面試外商軟體工程師的經驗,該網友被問到其中兩題 C 語言問題就出現在上述的教學內容中!這些概念不會真的很難,既然也都出現在外商面試題中了,可見這些指標知識都是重要的基本功

讓初學者感到相見恨晚的 Debugger

學習指標的過程,常常會發現指標位置錯了、但是不知道程式錯在哪裡,這時候就可以讓 Debugger (除錯器)來幫忙。

Debugger 會讓程式暫停在你自行設置的中斷點(Breaking Point),讓你控制並檢查程式在運行過程中的狀態、並縮小 Bug 可能出現的範圍。在你抓破頭皮也找不到 Bug 在哪的時候,正確使用 Debugger 能讓你更快找到問題,對 C 語言學習者而言是重要的工具,只不過在程式設計的學校課程或課本通常不會仔細教學,這門課會秀給你看 Debugger 的便利之處。

這門課,講師使用 Visual Studio 這個 IDE(整合開發環境)示範 ,你將學會如何用 Debugger 看清楚指標究竟跑到哪裡去了。課程提及的技巧包括:

  • 用 Immediate Window 看到運行當下變數如何變化、以及指標實際指向哪個地址
  • 幫 Debugger 加上 argument(命令列引數)、理解 *argv[] 用法
  • 在 Memory Window 直接觀察記憶體裡面發生什麼事,看出指標互相指引的關係
指標的指標?到底是誰的指標?練習用 Debugger 內的 immediate window 來看清楚!(Source: Udemy

學習程式偵錯,這門課用 IDE 教學的 Debugger 是重要的敲門磚,未來要接著學習 gdb 這類常用的偵錯工具,將能更快上手。

資料結構實戰學習

這門課 將大篇幅地介紹常見的線性資料結構:Linked List、Stack、以及 Queue。平時我們寫高階語言時,這些結構通常都有寫好的 Library 直接呼叫,但是,沒有詳細認識這些結構、盲目使用的話,可能導致程式效率變差!在這門課用 C 語言親手寫出這些結構後,你將更認識各個資料結構的優劣勢。例如,學會 Linked List 是用指標將一個個元素連結在一起之後,會知道它更適合動態分配資源的使用場景。

在實戰範例章節,筆者認為其中一個超重要的主題是:Deep & Shallow Copy。如果你寫過 Python,我們直接用這個範例說明問題點:

>>> arr = [[1,2], [3,4], [5,6]]
>>> arr_copy = arr.copy()
>>> arr[0]
[1, 2]
>>> arr[0][0] = 321
>>> arr
[[321, 2], [3, 4], [5, 6]]
>>> arr_copy
[[321, 2], [3, 4], [5, 6]]

我們更動了一個陣列元素的內容,居然也會改變另個陣列?!這就是複製物件時可能犯的 Shallow Copy 錯誤、可以用 Deep Copy 來解決。Python 提供 Deep & Shallow Copy 讓你使用,但是這兩種 Copy 究竟有什麼不一樣,在這門課用 C 語言的指標來學習可以更深刻的理解。不只是 C 語言,在這門課學好程式中的指標觀念,對我們學習任何程式語言都有很大的幫助

結語

老實說,在 這門課 後半段的資料結構實戰章節,筆者好豪曾經懷疑過自己:「我真的有必要學習用指標從頭寫出這些資料結構嗎?」,我上完課之後的寫程式經驗很快就回答了自己:「當然有!」。

試想一個基本的問題:有 100 個人位在同一個組別,如果我要更改組別的共同資訊(例如組別名稱),明明早就知道這 100 個資料的組別資訊必然一樣,那我還要對 100 筆資料做 100 次更動嗎?不是很沒效率嗎?

不用!我們可以一開始就把 100 個人的組別資訊用指標儲存、而不是存成數值,每個人都指向同一個組別資訊,只要改 1 次內容、100 個人的資訊就會同時更新!

而這個基本的指標思考,就成為我參加 2021 年的其中一項資料科學競賽解題的方式,想知道使用指標跟數據分析究竟有什麼關係的讀者,歡迎參考 好豪的 Shopee Code League 2021 數據分析競賽心得

不管你的工作是否需要寫 C 語言,我認為指標是學習電腦科學必須精熟的概念、是你寫任何語言都需要的內功。C 語言看似複雜,它提供的記憶體操作 API 很適合好好學習指標觀念,想精進軟體工程實力的你,快大膽加入 這門 C 語言指標 Udemy 課程 一起學習吧!


你跟我一樣熱愛自學嗎?好豪還寫過多篇線上課程的自學心得,推薦你閱讀:

推薦閱讀