自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全棧必備 :C語(yǔ)言基礎(chǔ)

開發(fā) 開發(fā)工具
C語(yǔ)言簡(jiǎn)潔,使用方便靈活,能直接訪問(wèn)物理地址,并進(jìn)行高效的位運(yùn)算。生成的目標(biāo)文件質(zhì)量高,執(zhí)行效率高,但這是相對(duì)而言的,比匯編語(yǔ)言的效率還是低了15%左右。數(shù)據(jù)處理尤其是圖像處理能力強(qiáng),可移植性也好。

[[402858]]

【引子】溫故而知新,“三日不彈,手生荊棘”,代碼也是如此。另一方面,自己挖的坑要自己填。在《全棧的技術(shù)棧設(shè)想》中埋下了4種編程語(yǔ)言的伏筆,已經(jīng)兌現(xiàn)了Javacript,Python和Java, 本想將C/C++一并整理,但涉及面向?qū)ο蟮仍O(shè)計(jì)技術(shù),最終還是C 梳理一下,從0到1吧。

C語(yǔ)言簡(jiǎn)潔,使用方便靈活,能直接訪問(wèn)物理地址,并進(jìn)行高效的位運(yùn)算。生成的目標(biāo)文件質(zhì)量高,執(zhí)行效率高,但這是相對(duì)而言的,比匯編語(yǔ)言的效率還是低了15%左右。數(shù)據(jù)處理尤其是圖像處理能力強(qiáng),可移植性也好。

關(guān)鍵字

ANSI C 共有32個(gè)關(guān)鍵字和9種控制語(yǔ)句,按照慣例編一首打油詩(shī)。

while signed for return,unsigned case continue default.

register goto auto union, do short long struct.

void typedef switch extern, volatile char double const.

if break static int, enum sizeof else float.

在C99中,又增加了5個(gè)關(guān)鍵字inline restrict _Bool _Complex _Imaginary, 后來(lái)的C11中又增加了7個(gè)關(guān)鍵字_Alignas _Alignof _Atomic _Static_assert _Noreturn _Thread_local _Generic, 所有這些關(guān)鍵字,不但要有所了解,還要知道其典型的應(yīng)用場(chǎng)景。

數(shù)據(jù)結(jié)構(gòu)

C語(yǔ)言為用戶提供了豐富的數(shù)據(jù)結(jié)構(gòu),還允許用戶自定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。C語(yǔ)言提供的數(shù)據(jù)結(jié)構(gòu)是以數(shù)據(jù)類型的形式給出的,C的數(shù)據(jù)類型劃分如下:

  • 基本類型
    • 數(shù)值類型
    • 字符類型
    • 枚舉類型
  • 構(gòu)造類型
    • 數(shù)組類型
    • 結(jié)構(gòu)類型
    • 聯(lián)合類型
  • 指針類型

數(shù)據(jù)有常量與變量之分,習(xí)慣上用大寫字母代表常量,用小寫字母代表變量。數(shù)值類型要注意數(shù)的范圍不同。字符常量是用單引號(hào)括起來(lái)的一個(gè)字符,還允許以一個(gè)“\”開頭的特殊字符常量。枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構(gòu)造類型,因?yàn)樗荒茉俜纸鉃槿魏位绢愋?。在編譯中,對(duì)枚舉元素按常量處理,故稱枚舉常量,它們不是變量,不能對(duì)它們賦值。

數(shù)組是有序數(shù)據(jù)的集合,數(shù)組中每一元素都屬于同一數(shù)據(jù)類型,用一個(gè)統(tǒng)一的數(shù)組名和下標(biāo)來(lái)唯一的確定數(shù)組中的元素。結(jié)構(gòu)體是C語(yǔ)言提供的一種數(shù)據(jù)結(jié)構(gòu),一般形式如下:

  1. struct 結(jié)構(gòu)體名字 
  2.        { 
  3.           成員列表 
  4.        } 變量名列表; 

一般地,可以利用宏取得結(jié)構(gòu)內(nèi)的偏移量:

#undef offsetofstruct #define offsetofstruct(TYPE, ELEMENT) ((size_t) &((TYPE *)0)->ELEMENT) #endif

聯(lián)合也是一種派生類型,語(yǔ)法和結(jié)構(gòu)體相同,不同是它的成員共享存儲(chǔ)空間。聯(lián)合定義了一組可供選擇的值,它們共享一塊內(nèi)存。

一個(gè)變量在內(nèi)存中的地址就稱為該變量的指針,這是C語(yǔ)言中的精華,下面單獨(dú)描述。

C語(yǔ)言還提供了十分豐富的運(yùn)算符,主要有如下34種:

  1. 算術(shù):+、-、*、/、++等 
  2. 關(guān)系:>、<、==、!=等 
  3. 邏輯:&&、||、!等 
  4. 位:>>、<<、~等 
  5. 賦值:等號(hào)(=)及其擴(kuò)展賦值運(yùn)算符(+=、-=、*=、/=等) 
  6. 指針:*、& 

用各種運(yùn)算符將運(yùn)算對(duì)象連接起來(lái)形成了表達(dá)式。

指針

C 語(yǔ)言的核心是指針,其靈活性和超長(zhǎng)之處源自于指針。指針提供了動(dòng)態(tài)操控內(nèi)存的機(jī)制,強(qiáng)化了對(duì)數(shù)據(jù)結(jié)構(gòu)的支持,且實(shí)現(xiàn)了訪問(wèn)硬件的功能。

指針是一個(gè)存放內(nèi)存地址的變量。定義一個(gè)指針時(shí),必須規(guī)定它指向的變量類型。任何指針都是指向某種類型的變量。當(dāng)通過(guò)指針來(lái)訪問(wèn)指針?biāo)赶虻膬?nèi)存區(qū)時(shí),指針?biāo)赶虻念愋蜎Q定了編譯器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來(lái)看。要注意區(qū)分指針的類型(即指針本身的類型)和指針?biāo)赶虻念愋褪莾蓚€(gè)概念。

void指針類型,即不指定它是指向哪一種類型數(shù)據(jù)的指針變量。void指針?biāo)梢灾赶蛉魏晤愋蛿?shù)據(jù),可以用任何類型的指針直接給void指針賦值。但是,如果需要將指針的值賦給其它類型的指針,則需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。在指針定義語(yǔ)句的類型前加const,表示指向的對(duì)象是常量。

指針變量可以指向另一個(gè)指針,指針的指針。程序中的函數(shù)代碼同樣也占有內(nèi)存空間,每個(gè)函數(shù)都有地址,因此指針同樣可以指向函數(shù),指向函數(shù)地址的指針?lè)Q為函數(shù)指針。總之,指針可以指向什么是沒(méi)有限制的,可以是變量、數(shù)組元素、動(dòng)態(tài)分配的內(nèi)存塊以及函數(shù)。

正確理解指針變量和函數(shù)指針的聲明,例如:(*(void(*)())0)(); 注意*p()和(*p)()的區(qū)別,前者含義是函數(shù)返回值為一個(gè)指針類型,后者含義p是一個(gè)指向函數(shù)的指針。

指針的典型用法:

  • 直接訪問(wèn)系統(tǒng)內(nèi)存
  • 引用函數(shù)
  • 構(gòu)造鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)
  • 引用動(dòng)態(tài)分配的數(shù)據(jù)結(jié)構(gòu)
  • 實(shí)現(xiàn)引用調(diào)用
  • 傳遞數(shù)組參數(shù)
  • 訪問(wèn)和迭代數(shù)據(jù)元素
  • 代表字符串
  • 作為其他值的別名

函數(shù)

一個(gè)大程序可分為若干個(gè)小程序模塊,每一個(gè)模塊用來(lái)實(shí)現(xiàn)一個(gè)特定的功能,這個(gè)模塊稱為函數(shù)。一個(gè)C程序可由一個(gè)主函數(shù)和若干子函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任何多次。

從用戶來(lái)看,可以將函數(shù)分為庫(kù)函數(shù)和自定義函數(shù)。從函數(shù)自身看,可以分為有參數(shù)和無(wú)參兩種。傳參過(guò)程中要根據(jù)需要進(jìn)行值傳遞和地址傳遞,也就是形參和實(shí)參。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)中的形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。

函數(shù)應(yīng)當(dāng)在同一文件中它被調(diào)用的位置之前定義,否則就會(huì)默認(rèn)返回值是整型。如果調(diào)用函數(shù)處和被調(diào)用函數(shù)不在同一文件,且返回值類型不同,連接時(shí)會(huì)報(bào)錯(cuò)。如果被調(diào)用函數(shù)參數(shù)包括char、short、float等類型,則在調(diào)用該函數(shù)的文件中必須聲明該函數(shù),且括號(hào)內(nèi)帶上參數(shù)類型。

本質(zhì)上,函數(shù)表示法就是指針表示法,函數(shù)名稱經(jīng)過(guò)求值會(huì)變成函數(shù)的地址,然后函數(shù)參數(shù)會(huì)被傳遞給函數(shù)。

程序棧是支持函數(shù)執(zhí)行的內(nèi)存區(qū)域,通常和堆共享,包括返回地址,局部數(shù)據(jù)存儲(chǔ),參數(shù)存儲(chǔ),棧指針和基指針(運(yùn)行時(shí)管理?xiàng)5闹羔?。系統(tǒng)在創(chuàng)建棧幀時(shí),將參數(shù)以跟聲明相反的順序推到幀上,最后推入局部變量。

從函數(shù)返回指針時(shí)可能存在的潛在問(wèn)題:

  • 返回未初始化的指針
  • 返回指向無(wú)效地址的指針
  • 返回局部變量的指針
  • 返回指針但是沒(méi)有釋放內(nèi)存

函數(shù)指針可以 以編譯時(shí)未確定的順序來(lái)執(zhí)行函數(shù)。

  1. void (*foo)() 

使用函數(shù)指針時(shí)一定要小心,因?yàn)閏 不會(huì)檢查參數(shù)傳遞是否正確,建議使用fptr作為前綴。函數(shù)指針數(shù)組可以基于某些條件選擇要執(zhí)行的函數(shù)。傳遞指針的指針可以讓參數(shù)指針指向不同的內(nèi)存地址。

內(nèi)存存儲(chǔ)

C中主要有4種存儲(chǔ)類型:

  1. auto只能用來(lái)標(biāo)識(shí)局部變量的存儲(chǔ)類型,對(duì)于局部變量,auto是默認(rèn)的存儲(chǔ)類型,不需要顯示的聲明。因此,auto標(biāo)識(shí)的變量存儲(chǔ)在棧區(qū)中。
  2. extern用來(lái)聲明全局變量。如果全局變量未被初始化,那么將被存在BBS區(qū)中,且在編譯時(shí),自動(dòng)將其值賦值為0,如果已經(jīng)被初始化,那么就被存在數(shù)據(jù)區(qū)中。全局變量,不管是否被初始化,其生命周期都是整個(gè)程序運(yùn)行過(guò)程中,為了節(jié)省內(nèi)存空間,在當(dāng)前文件中使用extern來(lái)聲明其它文件中定義的全局變量時(shí),就不會(huì)再為其分配內(nèi)存空間。
  3. register的變量在由內(nèi)存調(diào)入到CPU寄存器后,則常駐在CPU的寄存器中,因此register將在很大程度上提高效率,因?yàn)槭∪チ俗兞坑蓛?nèi)存調(diào)入到寄存器過(guò)程中的多個(gè)指令周期。
  4. static無(wú)論是全局的還是局部的,都存儲(chǔ)在數(shù)據(jù)區(qū)中,其生命周期為整個(gè)程序,如果是靜態(tài)局部變量,其作用域?yàn)橐粚?duì){}內(nèi),如果是靜態(tài)全局變量,其作用域?yàn)楫?dāng)前文件。靜態(tài)變量如果沒(méi)有被初始化,則自動(dòng)初始化為0。靜態(tài)變量只能夠初始化一次。

在使用內(nèi)存時(shí),申請(qǐng)與釋放要配對(duì),本著誰(shuí)申請(qǐng),誰(shuí)釋放的原則,釋放后,要把指針置空。常見的內(nèi)存使用問(wèn)題有3種:

  • 野指針:Free后,沒(méi)有置空,后續(xù)繼續(xù)使用該指針;
  • 內(nèi)存泄漏:申請(qǐng)后沒(méi)有釋放
  • 內(nèi)存越界:數(shù)組索引和內(nèi)存訪問(wèn)溢出

避免內(nèi)存越界,必須對(duì)數(shù)組的索引進(jìn)行有效值檢查,字符串操作API最好要帶n 例如strncpy,strncat等,內(nèi)存拷貝的size要做檢測(cè),避免野指針。

在條件允許的情況下,可以自己實(shí)現(xiàn)內(nèi)存池管理,按字節(jié)切割內(nèi)存池(例如 8字節(jié)的整數(shù)倍)。每次分配的內(nèi)存地址空間,在啟止位置進(jìn)行初始化特殊值,然后用單獨(dú)線程每隔一小段時(shí)間,對(duì)內(nèi)存池中每個(gè)有效塊進(jìn)行掃描,做好內(nèi)存碎片整理。

動(dòng)態(tài)分配存儲(chǔ)字符串的空間(malloc方式)時(shí),注意不要忘記字符串需要多分配一個(gè)字節(jié)保存字符串結(jié)尾'\0'。

編譯

C語(yǔ)言的編譯過(guò)程有預(yù)編譯——>語(yǔ)法分析——>代碼生成——>優(yōu)化——>匯編——>連接。預(yù)編譯器完成宏替換,詞法分析,并創(chuàng)建符號(hào)表。語(yǔ)法分析包含了語(yǔ)義分析,創(chuàng)建語(yǔ)法樹。代碼生成器來(lái)生成中間代碼,優(yōu)化器負(fù)責(zé)指令優(yōu)化,匯編程序生成匯編代碼,最后由連接器生成目標(biāo)文件和可執(zhí)行文件。連接器對(duì)目標(biāo)模塊中的外部對(duì)象做同名檢查,如果沒(méi)有命名沖突就加入到載入模塊。

函數(shù)和初始化的全局變量(包括初始化為0)是強(qiáng)符號(hào),未初始化的全局變量是弱符號(hào)。符號(hào)的意義就是將對(duì)一個(gè)對(duì)同一個(gè)名字的讀寫操作都指向同一塊內(nèi)存,即使這些操作分散在不同的.o中。

對(duì)于它們,下列三條規(guī)則使用:

  • 同名的強(qiáng)符號(hào)只能有一個(gè),否則編譯器報(bào)"重復(fù)定義"錯(cuò)誤。
  • 允許一個(gè)強(qiáng)符號(hào)和多個(gè)弱符號(hào),但定義會(huì)選擇強(qiáng)符號(hào)的。
  • 當(dāng)有多個(gè)弱符號(hào)相同時(shí),鏈接器選擇占用內(nèi)存空間最大的那個(gè)。

切記比較運(yùn)算符==不要錯(cuò)寫為賦值符號(hào)=,反之亦然,二者大為不同.詞法分析采用的是從左至右的貪心法,例如a---b等價(jià)于a-- -b,而不等價(jià)于a- --b;

預(yù)編譯

通常在C編譯系統(tǒng)對(duì)程序進(jìn)行編譯前,先對(duì)程序中一些特殊的命令進(jìn)行“預(yù)處理”,然后將預(yù)處理的結(jié)果和源程序一起進(jìn)行編譯處理,得到目標(biāo)代碼, 以“#”開始的行成為預(yù)處理指令。

帶參數(shù)的宏與函數(shù)非常類似,在引用函數(shù)時(shí)也是在函數(shù)名后的括號(hào) 內(nèi)寫實(shí)參,且要求實(shí)參的數(shù)目等于形參的數(shù)目,但它們還是有區(qū)別的:

對(duì)參數(shù)的使用方式不一樣。函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后帶入形參;宏只進(jìn)行簡(jiǎn)單的字符替換。

處理機(jī)制不一樣。函數(shù)調(diào)用在程序運(yùn)行時(shí)處理,且要分配內(nèi)存;宏展開在編譯時(shí)進(jìn)行,不分配內(nèi)存單元,不發(fā)生值的傳遞處理,也不存在返回值

定義時(shí)的要求不一樣。函數(shù)定義時(shí),實(shí)參和形參都要定義類型;宏定義時(shí)不存

預(yù)處理程序提供了條件編譯的功能??梢园床煌臈l件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件,這對(duì)于程序的移植和調(diào)試是很有用的。條件編譯有三種形式:

  1. #ifdef 標(biāo)識(shí)符 
  2.     codes1 
  3. #else 
  4.     codes2 
  5. #endif 
  6.  
  7. #ifdef 標(biāo)識(shí)符 
  8.     codes3 
  9. #endif  
  10.  
  11. #ifndef 標(biāo)識(shí)符 
  12.     codes4 
  13. #else 
  14.     codes5  
  15. #endif 

頭文件

一般的,通過(guò)頭文件來(lái)調(diào)用庫(kù)功能。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫(kù)即可。用戶只需要按照頭文件中的接口聲明來(lái)調(diào)用庫(kù)功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼。頭文件還能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。

使用尖括號(hào)引入的頭文件在包含文件目錄中去查找(包含目錄是由用 戶在設(shè)置環(huán)境時(shí)設(shè)置的),而不在源文件目錄去查找。使用雙引號(hào)則表示首先在當(dāng)前的源文件目錄中查找,若未找到才到所包含目錄中去查找。用戶編程時(shí)可根據(jù)自己的文件所在的目錄來(lái)選擇某一種命令形式。

程序框架與庫(kù)

C語(yǔ)言中的程序框架是由頭文件,變量聲明,main函數(shù)和子函數(shù)組成。無(wú)處不在的helloword 在C中是這樣的:

  1. #include <stdio.h>  
  2. int main() 
  3.     printf("Hello, World! \n");  
  4.     return 0;  

里面沒(méi)有變量聲明和子函數(shù)。那沒(méi)有main 函數(shù)是否可以呢?或者說(shuō),不寫成main函數(shù),換個(gè)其他的名字是否可以呢?這涉及到編譯的指定,main 是c中默認(rèn)的調(diào)用入口。

C中的那些庫(kù)就大都沒(méi)有main函數(shù)。C語(yǔ)言中的庫(kù)分為靜態(tài)庫(kù)(.a)和動(dòng)態(tài)庫(kù)(.so)。

靜態(tài)庫(kù)實(shí)際上是一些目標(biāo)文件的集合,用于連接器生成可執(zhí)行文件階段。連接器會(huì)將程序中使用到函數(shù)的代碼從庫(kù)文件中拷貝到應(yīng)用程序中,一旦連接完成生成可執(zhí)行文件之后,在執(zhí)行程序的時(shí)候就不需要靜態(tài)庫(kù)了。動(dòng)態(tài)庫(kù)也叫共享庫(kù),在程序鏈接的時(shí)候只是作些標(biāo)記,然后在程序開始啟動(dòng)運(yùn)行的時(shí)候,動(dòng)態(tài)地加載所需庫(kù)(模塊)。

C標(biāo)準(zhǔn)庫(kù)有各種不同的實(shí)現(xiàn),比如最著名的glibc, 用于嵌入式Linux的uClibc,還有ARM自己的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)等。不同標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)并不相同,提供的函數(shù)也不完全相同,不過(guò)有一個(gè)它們都支持的最小子集,這也就是最典型的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)。

C標(biāo)準(zhǔn)庫(kù)由在15個(gè)頭文件中聲明的函數(shù)、類型定義和宏組成,每個(gè)頭文件都代表了一定范圍的編程功能。有人說(shuō),C標(biāo)準(zhǔn)庫(kù)可以分為 3 組,如何正確并熟練的使用它們,可區(qū)分出 3 個(gè)層次的程序員:

  • 合格程序員:、、
  • 熟練程序員:、 、、
  • 優(yōu)秀程序員:、、、

運(yùn)行時(shí)

在C語(yǔ)言運(yùn)行時(shí)的數(shù)據(jù)結(jié)構(gòu)中,堆棧為局部變量提供存儲(chǔ)空間,為函數(shù)調(diào)用提供還原信息,其臨時(shí)存儲(chǔ)區(qū),用于計(jì)算復(fù)雜算術(shù)表達(dá)式;調(diào)用記錄支持過(guò)程調(diào)用,并記錄調(diào)用結(jié)束后返回調(diào)用點(diǎn)所需要的全部信息;全局變量的數(shù)據(jù)有static變量,常量等。

BSS段(bss segment)

通常是指用來(lái)存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域。BSS段屬于靜態(tài)內(nèi)存分配。

數(shù)據(jù)段(data segment)

通常是指用來(lái)存放程序中 已初始化 的 全局變量 的一塊內(nèi)存區(qū)域。數(shù)據(jù)段屬于靜態(tài)內(nèi)存分配。

代碼段(code segment/text segment)

通常是指用來(lái)存放程序執(zhí)行代碼的一塊內(nèi)存區(qū)域。這部分區(qū)域的大小在程序運(yùn)行前就已經(jīng)確定,并且內(nèi)存區(qū)域通常屬于 只讀 , 某些架構(gòu)也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些 只讀的常數(shù)變量 ,例如字符串常量等。程序段為程序代碼在內(nèi)存中的映射。

堆(heap)

堆是用于存放進(jìn)程運(yùn)行中被動(dòng)態(tài)分配的內(nèi)存段,它的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減。當(dāng)進(jìn)程調(diào)用malloc/free等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張)/釋放的內(nèi)存從堆中被剔除(堆被縮減)。

棧(stack)

棧又稱堆棧,存放程序的局部變量(但不包括static聲明的變量, static 意味著 在數(shù)據(jù)段中 存放變量)。除此以外,在函數(shù)被調(diào)用時(shí),棧用來(lái)傳遞參數(shù)和返回值。由于棧的先進(jìn)先出特點(diǎn),所以棧特別方便用來(lái)保存/恢復(fù)調(diào)用現(xiàn)場(chǎng)。

程序在進(jìn)入main函數(shù)之前,已經(jīng)完成數(shù)據(jù)在內(nèi)存中的分配、初始化,包括數(shù)據(jù)區(qū),堆棧區(qū)等。關(guān)于這部分代碼對(duì)于開發(fā)者不可見,屬于C標(biāo)準(zhǔn)運(yùn)行時(shí)的一部分。

函數(shù)在調(diào)用和被調(diào)用過(guò)程中,都伴隨著入棧和出棧,因此棧發(fā)揮著重要作用。函數(shù)的局部變量、參數(shù)、返回值都存在棧區(qū)中。函數(shù)結(jié)束后,棧區(qū)空間自動(dòng)釋放,棧區(qū)擔(dān)任著一個(gè)臨時(shí)存儲(chǔ)的角色,是計(jì)算機(jī)利用內(nèi)存空間的一種機(jī)制。

了解了C 運(yùn)行時(shí)的空間分布是遠(yuǎn)遠(yuǎn)不夠的,最好了解一下一個(gè)編譯后的代碼是如何運(yùn)行起來(lái)的,以及庫(kù)中的函數(shù)是如何鏈接到目標(biāo)代碼的,尤其是函數(shù)指針鏈表的維護(hù),之后會(huì)有一種對(duì)代碼完全掌控的感覺(jué)。

不是小結(jié)的小結(jié)

C語(yǔ)言不但能讓我們了解編程的相關(guān)概念,還能讓我們明白程序的運(yùn)行原理,比如,計(jì)算機(jī)的各子系統(tǒng)是如何交互,程序在內(nèi)存中是一種怎樣的,操作系統(tǒng)和程序之間的“愛恨情仇”,這些底層知識(shí)對(duì)程序員的職業(yè)生涯大有裨益。

C語(yǔ)言被一些人譽(yù)為“上帝語(yǔ)言”,它幾乎奠定了軟件產(chǎn)業(yè)的基礎(chǔ),還創(chuàng)造了很多其它語(yǔ)言。但是,鑒于水平有限,難以舉重若輕,本文中的基礎(chǔ)描述只是老碼農(nóng)的碎碎念罷了。

 

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-04-06 10:27:01

JavaScript基礎(chǔ)Java

2020-07-20 08:23:04

Redis分布式系統(tǒng)

2017-06-13 15:10:02

大數(shù)據(jù)Log日志

2017-06-13 08:55:29

Log日志MySQL

2017-10-12 14:24:24

2017-12-18 15:33:56

Java基礎(chǔ)編程

2017-04-12 14:45:20

數(shù)據(jù)架構(gòu)數(shù)據(jù)源

2023-12-10 20:30:51

SQL工具數(shù)據(jù)

2017-08-07 13:02:32

全棧必備貝葉斯

2018-01-09 15:35:54

Python編程基礎(chǔ)

2015-08-04 09:40:10

Python大數(shù)據(jù)全棧式

2023-02-17 08:14:29

C語(yǔ)言C技巧內(nèi)存

2015-08-17 09:27:51

全棧工程師Devops工具周期表

2023-08-21 09:51:57

全棧軟件開發(fā)

2023-07-03 00:47:23

2023-12-08 14:32:02

C語(yǔ)言編程文件操作

2017-11-10 19:00:37

華為

2013-12-09 09:42:50

JavaScript全棧式

2011-07-25 17:31:49

iPhone Objective-

2013-08-05 15:44:36

C語(yǔ)言基礎(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)