對(duì)于學(xué)習(xí)嵌入式Linux開(kāi)發(fā),務(wù)必先搞定C語(yǔ)言,這里的C語(yǔ)言既包括基礎(chǔ)的C語(yǔ)言語(yǔ)法,也包括對(duì)于Linux的調(diào)用和編程實(shí)現(xiàn),很多同學(xué)都容易忽視后者。
我之前寫(xiě)過(guò)關(guān)于嵌入式Linux的整體路線,也不矛盾,因?yàn)榍度胧絃inux有很多技術(shù)和方向,需要不斷的探索學(xué)習(xí),今天主要說(shuō)的是從C語(yǔ)言角度切入。
如果有感興趣想入門(mén)的同學(xué)也歡迎參加我的一對(duì)一咨詢(xún),可以在職業(yè)生涯初期快速進(jìn)步,非常超值的個(gè)人投資。
首先是C語(yǔ)言基礎(chǔ)學(xué)習(xí)思路:
對(duì)于C語(yǔ)言基礎(chǔ),可以直接選擇一本書(shū)或者一個(gè)比較好的教程都可以,這部分是大同小異的。
我個(gè)人比較喜歡《C語(yǔ)言程序設(shè)計(jì)現(xiàn)代方法》這本書(shū),也是我看了很多本C語(yǔ)言書(shū)籍之后的考量。
C語(yǔ)言的基礎(chǔ)知識(shí)主要包括:
一、基本語(yǔ)法
語(yǔ)句:C語(yǔ)言的代碼由一行行語(yǔ)句組成,語(yǔ)句是程序執(zhí)行的一個(gè)操作命令。C語(yǔ)言規(guī)定,語(yǔ)句必須使用分號(hào)結(jié)尾。
表達(dá)式:C語(yǔ)言的各種計(jì)算主要通過(guò)表達(dá)式完成。表達(dá)式是一個(gè)計(jì)算式,用來(lái)獲取值。
語(yǔ)句塊:C語(yǔ)言允許多個(gè)語(yǔ)句使用一對(duì)大括號(hào){}組成一個(gè)塊,也稱(chēng)為復(fù)合語(yǔ)句。
空格與注釋?zhuān)嚎崭裰饕脕?lái)幫助編譯器區(qū)分語(yǔ)法單位,增加代碼的可讀性。注釋是對(duì)代碼的說(shuō)明,編譯器會(huì)忽略注釋。
二、數(shù)據(jù)類(lèi)型
C語(yǔ)言提供了豐富的數(shù)據(jù)類(lèi)型來(lái)支持不同的數(shù)據(jù)操作和存儲(chǔ)需求,包括:
整型:如char(1字節(jié))、short(2字節(jié))、int(通常為4字節(jié))、long(通常為4或8字節(jié))、long long(8字節(jié)),用于存儲(chǔ)整數(shù)值。
浮點(diǎn)型:如float(4字節(jié),單精度)、double(8字節(jié),雙精度)、long double(通常為8或16字節(jié),更高精度),用于存儲(chǔ)帶小數(shù)部分的近似值。
字符型:char類(lèi)型用于存儲(chǔ)單個(gè)字符。
布爾型:_Bool類(lèi)型用于存儲(chǔ)布爾值(true或false)。
指針型:指針是一種特殊的數(shù)據(jù)類(lèi)型,用于存儲(chǔ)變量的內(nèi)存地址。
數(shù)組型:數(shù)組是一種存儲(chǔ)相同類(lèi)型數(shù)據(jù)的集合,可以通過(guò)索引訪問(wèn)其中的元素。
結(jié)構(gòu)體:struct用于定義一種包含不同數(shù)據(jù)類(lèi)型成員的復(fù)合數(shù)據(jù)類(lèi)型。
共用體:union用于定義一種可以存儲(chǔ)不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)結(jié)構(gòu),但只能同時(shí)存儲(chǔ)其中的一種數(shù)據(jù)類(lèi)型。
枚舉型:enum用于定義一組具有離散取值的常量。
空類(lèi)型:void表示沒(méi)有類(lèi)型,用于返回沒(méi)有值(void函數(shù))或作為通用指針類(lèi)型。
三、變量與常量
變量:變量是內(nèi)存中的一塊區(qū)域,用于存儲(chǔ)數(shù)據(jù)。變量名必須以字母或下劃線開(kāi)頭,只能包含字母、數(shù)字和下劃線,且不能使用C語(yǔ)言的關(guān)鍵字。變量需要先定義后使用,定義時(shí)需要指定其類(lèi)型。
常量:常量是程序運(yùn)行過(guò)程中值不變的量。在C語(yǔ)言中,常量可以用直接的數(shù)值表示,也可以通過(guò)#define預(yù)處理指令或const關(guān)鍵字定義。
四、運(yùn)算符
C語(yǔ)言提供了豐富的運(yùn)算符,包括:
算術(shù)運(yùn)算符:如+(加)、-(減)、*(乘)、/(除)、%(取模)。
關(guān)系運(yùn)算符:如==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
邏輯運(yùn)算符:如&&(邏輯與)、||(邏輯或)、!(邏輯非)。
位運(yùn)算符:如<<(左移)、>>(右移)、~(按位取反)、|(按位或)、^(按位異或)、&(按位與)。
賦值運(yùn)算符:如=(賦值)、+=(加后賦值)、-=(減后賦值)等。
條件運(yùn)算符:? :,用于實(shí)現(xiàn)簡(jiǎn)單的條件判斷。
其他運(yùn)算符:如逗號(hào)運(yùn)算符,、指針運(yùn)算符*和&、求字節(jié)運(yùn)算符sizeof、強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符(類(lèi)型)等。
五、控制結(jié)構(gòu)
C語(yǔ)言提供了三種基本控制結(jié)構(gòu)來(lái)實(shí)現(xiàn)程序的流程控制:
順序結(jié)構(gòu):按照書(shū)寫(xiě)順序執(zhí)行每條語(yǔ)句。
選擇結(jié)構(gòu):根據(jù)條件表達(dá)式的值選擇執(zhí)行不同的語(yǔ)句塊。C語(yǔ)言提供if語(yǔ)句和switch語(yǔ)句來(lái)實(shí)現(xiàn)選擇結(jié)構(gòu)。
循環(huán)結(jié)構(gòu):在指定條件下重復(fù)執(zhí)行某些操作。C語(yǔ)言提供while語(yǔ)句、do-while語(yǔ)句和for語(yǔ)句來(lái)實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。
六、函數(shù)
函數(shù)定義:函數(shù)是完成特定功能的代碼塊。C語(yǔ)言中的函數(shù)包括標(biāo)準(zhǔn)庫(kù)函數(shù)和自定義函數(shù)。自定義函數(shù)需要按照一定的格式進(jìn)行定義,包括函數(shù)返回類(lèi)型、函數(shù)名和參數(shù)列表。
函數(shù)調(diào)用:通過(guò)函數(shù)名和參數(shù)列表來(lái)調(diào)用函數(shù),執(zhí)行函數(shù)體內(nèi)的代碼。函數(shù)調(diào)用可以實(shí)現(xiàn)代碼的重用和模塊化編程。
函數(shù)參數(shù)傳遞:C語(yǔ)言采用值傳遞的方式傳遞函數(shù)參數(shù)。調(diào)用函數(shù)時(shí),實(shí)參的值會(huì)復(fù)制給形參,函數(shù)體內(nèi)對(duì)形參的修改不會(huì)影響實(shí)參的值。
七、指針
指針概念:指針是C語(yǔ)言中的一個(gè)重要概念,它存儲(chǔ)了變量的內(nèi)存地址。通過(guò)指針,可以直接訪問(wèn)和修改該地址上的數(shù)據(jù)。
指針運(yùn)算:可以對(duì)指針進(jìn)行算術(shù)運(yùn)算(如加、減)和關(guān)系運(yùn)算(如比較)。這些運(yùn)算基于指針?biāo)赶虻臄?shù)據(jù)類(lèi)型的大小進(jìn)行。
指針與數(shù)組:數(shù)組名在大多數(shù)情況下被視為指向數(shù)組首元素的指針。因此,可以使用指針來(lái)遍歷和操作數(shù)組中的元素。
指針與函數(shù):可以將指針作為函數(shù)的參數(shù)和返回值,以實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配、數(shù)組傳遞等功能。
八、輸入輸出
標(biāo)準(zhǔn)輸入輸出函數(shù):C語(yǔ)言提供了標(biāo)準(zhǔn)輸入輸出函數(shù),如printf()用于向標(biāo)準(zhǔn)輸出設(shè)備(通常是屏幕)輸出格式化的數(shù)據(jù),scanf()用于從標(biāo)準(zhǔn)輸入設(shè)備(通常是鍵盤(pán))讀取格式化的數(shù)據(jù)。
文件輸入輸出:C語(yǔ)言還支持文件輸入輸出操作,可以使用fopen()、fclose()、fread()、fwrite()等函數(shù)進(jìn)行文件的打開(kāi)、關(guān)閉、讀取和寫(xiě)入操作。
學(xué)完基礎(chǔ)知識(shí)想繼續(xù)提升就需要練習(xí):
這里的練習(xí)有多種方法,我個(gè)人是學(xué)完之后就可以做單片機(jī)開(kāi)發(fā)有關(guān)的項(xiàng)目了,通過(guò)項(xiàng)目中練習(xí),但是這種方法門(mén)檻高,比較適合在校同學(xué)(而且是大一大二這種)。
對(duì)于求職就業(yè)更好的手段則是刷題,刷題可以先看面試題,這種題更多的是對(duì)于C語(yǔ)言基礎(chǔ)邏輯的考察,更適合入門(mén)刷題。
對(duì)于LeetCode這種算法題,則需要補(bǔ)充數(shù)據(jù)結(jié)構(gòu)和常規(guī)算法的知識(shí),不然會(huì)無(wú)法切入。這個(gè)我在之前的文章也說(shuō)過(guò),總得來(lái)說(shuō),編程學(xué)習(xí)是有所謂的嵌套知識(shí)的,你感覺(jué)難很大的原因都是你不知道什么知識(shí)嵌套進(jìn)來(lái)了,看不懂搞定也是自然。
必須掌握的編程基礎(chǔ)“四大件”詳解
所以對(duì)于這種情況,我才有了一對(duì)一咨詢(xún),幫忙同學(xué)快速入門(mén)的想法和服務(wù),也是歡迎大家咨詢(xún)。
然后就是Linux上C語(yǔ)言編程的學(xué)習(xí):
這步其實(shí)是可以直接開(kāi)始的,但是由于很多C語(yǔ)言都是入門(mén)同學(xué),上來(lái)直接搞Linux,很有可能被環(huán)境搞死,所以這個(gè)暫時(shí)往后放了。對(duì)于Linux下的學(xué)習(xí)也是分幾個(gè)步驟。
1.環(huán)境的使用
你需要先安裝環(huán)境,這里涉及到虛擬機(jī),鏡像系統(tǒng)的安裝,還有編程環(huán)境的搭建。然后就是上邊C語(yǔ)言基礎(chǔ)部分的實(shí)踐都可以在Linux下踐行。
2.編譯調(diào)試工具的學(xué)習(xí)
對(duì)于gcc,很多在Windows下編程的同學(xué)接觸是比較少,所以轉(zhuǎn)到Linux后這是首先需要了解學(xué)習(xí)的部分。
另外還有Makefile,這也是需要了解學(xué)習(xí)的部分,之前在Windows下都是集成好的。
至于調(diào)試工具,最常用的事GDB,這是一個(gè)很強(qiáng)大的工具,很多所謂的Linux高手都是因?yàn)橥娴囊皇趾谜{(diào)試,畢竟對(duì)于工作來(lái)說(shuō),解bug的時(shí)間比寫(xiě)代碼都多,會(huì)調(diào)試是必須的。
3.最后就是Linux應(yīng)用編程學(xué)習(xí)了:
到這里其實(shí)才是接近工作的真實(shí)場(chǎng)景,如果你之后想做的是Linux應(yīng)用開(kāi)發(fā)工程師,就需要學(xué)習(xí)這部分知識(shí)。
進(jìn)程管理:理解Linux中的進(jìn)程概念,學(xué)習(xí)如何創(chuàng)建和管理進(jìn)程。
文件操作:學(xué)習(xí)如何在Linux中使用系統(tǒng)調(diào)用進(jìn)行文件讀寫(xiě)和其他文件操作。
網(wǎng)絡(luò)編程:掌握套接字編程,了解如何建立和管理網(wǎng)絡(luò)連接,實(shí)現(xiàn)數(shù)據(jù)傳輸。
多線程編程:學(xué)習(xí)如何在Linux中創(chuàng)建和管理線程,理解并發(fā)和同步機(jī)制。
進(jìn)程間通信(IPC):了解如管道、消息隊(duì)列、共享內(nèi)存和信號(hào)等進(jìn)程間通信機(jī)制。
動(dòng)態(tài)鏈接庫(kù):了解Linux支持動(dòng)態(tài)鏈接庫(kù)(共享庫(kù))的概念,以及如何在運(yùn)行時(shí)動(dòng)態(tài)加載和卸載共享庫(kù)。
系統(tǒng)調(diào)用:理解系統(tǒng)調(diào)用是用戶(hù)空間程序和內(nèi)核之間進(jìn)行通信的方式,掌握常用的系統(tǒng)調(diào)用函數(shù),如open、read、write、close等。
操作系統(tǒng)API:學(xué)習(xí)如何使用Linux操作系統(tǒng)提供的API來(lái)實(shí)現(xiàn)應(yīng)用需要完成的任務(wù)。
調(diào)試工具:掌握調(diào)試工具的使用方法,如GDB等,以便更好地解決程序中的問(wèn)題。
性能優(yōu)化:了解如何進(jìn)行性能優(yōu)化,包括代碼優(yōu)化、內(nèi)存管理優(yōu)化等,以提高應(yīng)用的運(yùn)行效率。
4.最后,就是項(xiàng)目的練習(xí)
發(fā)現(xiàn)沒(méi)有,如果你連C語(yǔ)言還沒(méi)搞定,就想直接做項(xiàng)目,難度是很大的,因?yàn)槟闳鄙俸芏啾貍涞闹R(shí)和學(xué)習(xí)方法,這不是正確的學(xué)習(xí)方法。
未完待續(xù),持續(xù)更新!以防后邊找不到可以點(diǎn)贊收藏下!