C語(yǔ)言程序設(shè)計(jì)基本知識(shí)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)基本知識(shí)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)基本知識(shí)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)基本知識(shí)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)基本知識(shí)_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語(yǔ)言程序設(shè)計(jì)基本知識(shí)從零基礎(chǔ)到系統(tǒng)掌握的編程入門全指南Contents課程目錄C語(yǔ)言程序設(shè)計(jì)基本知識(shí)01C語(yǔ)言概述與程序結(jié)構(gòu)02數(shù)據(jù)類型、變量與運(yùn)算符03控制流語(yǔ)句與函數(shù)04數(shù)組、指針與內(nèi)存管理CHAPTER01C語(yǔ)言概述與程序結(jié)構(gòu)了解C語(yǔ)言的歷史淵源、核心特點(diǎn)與程序的基本骨架HistoryC語(yǔ)言的發(fā)展歷史C語(yǔ)言誕生于1972年的貝爾實(shí)驗(yàn)室,由DennisRitchie在BCPL和B語(yǔ)言基礎(chǔ)上創(chuàng)造。它因重寫Unix操作系統(tǒng)而一舉成名,至今仍是系統(tǒng)編程和嵌入式開(kāi)發(fā)的基石語(yǔ)言。1967MartinRichards開(kāi)發(fā)BCPL語(yǔ)言,KenThompson簡(jiǎn)化為B語(yǔ)言并用于編寫最早的Unix系統(tǒng)1972DennisRitchie在貝爾實(shí)驗(yàn)室將B語(yǔ)言擴(kuò)展為C語(yǔ)言,增加數(shù)據(jù)類型和結(jié)構(gòu)化特性,并用C重寫了Unix1978Kernighan與Ritchie合著《C程序設(shè)計(jì)語(yǔ)言》出版,成為C語(yǔ)言的權(quán)威參考和事實(shí)上的行業(yè)標(biāo)準(zhǔn)1989ANSIC(C89/C90)標(biāo)準(zhǔn)正式發(fā)布,統(tǒng)一各編譯器間的語(yǔ)法差異,奠定現(xiàn)代C語(yǔ)言的基礎(chǔ)框架2011C11標(biāo)準(zhǔn)加入多線程支持與匿名結(jié)構(gòu)體等現(xiàn)代特性,C23進(jìn)一步強(qiáng)化類型安全與泛型編程能力DennisRitchie·貝爾實(shí)驗(yàn)室·C語(yǔ)言之父CLANGUAGE·編程基礎(chǔ)C語(yǔ)言的核心特點(diǎn)與應(yīng)用領(lǐng)域C語(yǔ)言兼具高級(jí)語(yǔ)言的結(jié)構(gòu)化能力和低級(jí)語(yǔ)言的硬件控制能力,以高效性、可移植性和靈活性著稱。COREFEATURES·核心特點(diǎn)高效性PERFORMANCE編譯生成的機(jī)器碼運(yùn)行效率極高,接近匯編語(yǔ)言性能,適合對(duì)速度要求苛刻的系統(tǒng)級(jí)開(kāi)發(fā)場(chǎng)景。可移植性PORTABILITY源代碼可在不同操作系統(tǒng)和硬件平臺(tái)上編譯運(yùn)行,無(wú)需大幅修改即可實(shí)現(xiàn)跨平臺(tái)部署與遷移。靈活性FLEXIBILITY支持指針直接操作內(nèi)存地址,既能結(jié)構(gòu)化編程,又能像底層語(yǔ)言一樣精確控制硬件資源。APPLICATIONS·應(yīng)用領(lǐng)域操作系統(tǒng)OSKERNELLinux內(nèi)核、Windows核心模塊、macOS底層組件均大量使用C語(yǔ)言編寫,是系統(tǒng)編程的基石。嵌入式系統(tǒng)EMBEDDED單片機(jī)固件、物聯(lián)網(wǎng)設(shè)備驅(qū)動(dòng)、汽車ECU控制程序等資源受限環(huán)境的首選開(kāi)發(fā)語(yǔ)言。基礎(chǔ)設(shè)施INFRA數(shù)據(jù)庫(kù)引擎(MySQL/PostgreSQL)、Web服務(wù)器(Nginx)、編譯器(GCC)等核心軟件的基礎(chǔ)。Chapter01·BasicStructureC程序的基本結(jié)構(gòu)每個(gè)C程序都遵循固定的結(jié)構(gòu)框架:預(yù)處理指令引入所需庫(kù)文件,main()函數(shù)作為程序唯一入口,函數(shù)體由若干語(yǔ)句組成,每條語(yǔ)句以分號(hào)結(jié)尾。理解這一骨架是編寫任何C程序的前提。預(yù)處理指令如#include<stdio.h>,在編譯前執(zhí)行,負(fù)責(zé)引入頭文件中的函數(shù)聲明和宏定義,是使用標(biāo)準(zhǔn)庫(kù)功能的必要前提#includemain()函數(shù)C程序的唯一入口點(diǎn),操作系統(tǒng)從main開(kāi)始執(zhí)行,返回類型int表示向系統(tǒng)返回整數(shù)狀態(tài)碼EntryPoint函數(shù)體與語(yǔ)句函數(shù)體由花括號(hào){}包圍,內(nèi)部包含若干語(yǔ)句,每條語(yǔ)句必須以分號(hào)結(jié)尾——遺漏分號(hào)是最常見(jiàn)的編譯錯(cuò)誤;Semicolonprintf()輸出標(biāo)準(zhǔn)輸出函數(shù),用于在控制臺(tái)打印格式化文本;'\n'為轉(zhuǎn)義字符,將光標(biāo)移至下一行起始位置stdoutreturn0;標(biāo)志主函數(shù)正常結(jié)束并返回狀態(tài)碼0給操作系統(tǒng),非零返回值通常表示程序執(zhí)行過(guò)程中出現(xiàn)了異常StatusCodeCOMPILATIONPROCESSC程序的編譯與執(zhí)行過(guò)程C程序從源代碼到運(yùn)行需經(jīng)歷預(yù)處理、編譯、鏈接、執(zhí)行四個(gè)階段。理解這一完整流程不僅能幫助初學(xué)者建立正確的開(kāi)發(fā)認(rèn)知,更是排查編譯錯(cuò)誤和鏈接錯(cuò)誤的知識(shí)基礎(chǔ)。01預(yù)處理編譯器處理所有#開(kāi)頭的指令,包括將頭文件內(nèi)容插入源文件、展開(kāi)宏定義、處理?xiàng)l件編譯指令#include02編譯將預(yù)處理后的源代碼逐文件翻譯為匯編語(yǔ)言,再匯編為機(jī)器能直接識(shí)別的目標(biāo)代碼文件,此階段檢查語(yǔ)法錯(cuò)誤.obj/.o03鏈接將多個(gè)目標(biāo)代碼文件與C標(biāo)準(zhǔn)庫(kù)函數(shù)進(jìn)行鏈接合并,解析所有外部引用,生成最終的可執(zhí)行文件.exe/ELF04執(zhí)行操作系統(tǒng)將可執(zhí)行文件加載到內(nèi)存中,從main()函數(shù)入口開(kāi)始逐條執(zhí)行指令,程序結(jié)束后通過(guò)return值報(bào)告運(yùn)行狀態(tài)main()COMMENTSTYLE注釋規(guī)范與代碼書(shū)寫習(xí)慣良好的注釋習(xí)慣和命名規(guī)范是專業(yè)程序員的基本素養(yǎng)。注釋幫助他人(和未來(lái)的自己)快速理解代碼意圖,而有意義的變量命名則能讓代碼本身就具備可讀性,大幅降低維護(hù)成本。01單行注釋以//開(kāi)頭,從斜杠到行末的內(nèi)容被編譯器忽略,適合為單條語(yǔ)句添加簡(jiǎn)短說(shuō)明。intcount=0;//初始化計(jì)數(shù)器SINGLE-LINE02多行注釋以/*開(kāi)始、*/結(jié)束,可跨越多行但不支持嵌套使用,適合為函數(shù)或復(fù)雜邏輯塊添加詳細(xì)說(shuō)明和參數(shù)描述。/*計(jì)算學(xué)生總成績(jī)*/MULTI-LINE03變量命名必須有語(yǔ)義:使用studentAge、totalScore等描述性名稱,避免a、b、temp等無(wú)意義縮寫,讓代碼具備自解釋能力。?studentAge?a,b,tempSEMANTIC04命名規(guī)則:僅允許字母、數(shù)字和下劃線組成,不能以數(shù)字開(kāi)頭,C語(yǔ)言嚴(yán)格區(qū)分大小寫(count與Count是兩個(gè)不同變量)。?_value,score2?2score,my-varRULESChapter02數(shù)據(jù)類型、變量與運(yùn)算符掌握C語(yǔ)言的基礎(chǔ)構(gòu)建模塊——數(shù)據(jù)的存儲(chǔ)方式與操作方法DATATYPESC語(yǔ)言基本數(shù)據(jù)類型C語(yǔ)言提供了一套層次分明的內(nèi)置數(shù)據(jù)類型體系:整型家族覆蓋從1字節(jié)到8字節(jié)的不同精度需求,浮點(diǎn)類型滿足小數(shù)運(yùn)算場(chǎng)景,字符型和布爾型則分別服務(wù)于文本處理和邏輯判斷。合理選擇數(shù)據(jù)類型是編寫高效程序的第一步。整型家族char占1字節(jié)(-128~127),short占2字節(jié),int占4字節(jié)(約±21億),longlong占8字節(jié),可根據(jù)數(shù)據(jù)范圍選擇合適類型unsigned修飾符可將整型轉(zhuǎn)為無(wú)符號(hào)版本,存儲(chǔ)范圍翻倍但僅表示非負(fù)數(shù),常用于位運(yùn)算和系統(tǒng)編程場(chǎng)景1B·2B·4B·8B浮點(diǎn)類型float占4字節(jié)(約7位有效精度),double占8字節(jié)(約15位),科學(xué)計(jì)算和金融場(chǎng)景優(yōu)先使用double避免精度損失浮點(diǎn)數(shù)在內(nèi)存中以IEEE754標(biāo)準(zhǔn)存儲(chǔ),并非所有十進(jìn)制小數(shù)都能被精確的二進(jìn)制浮點(diǎn)表示,這是產(chǎn)生精度誤差的根本原因IEEE754字符與布爾char本質(zhì)是1字節(jié)整數(shù),存儲(chǔ)字符的ASCII碼值(如'A'=65、'0'=48),可用%d輸出數(shù)值或%c輸出字符C99標(biāo)準(zhǔn)引入_Bool/bool類型(需包含stdbool.h),取值為true(1)或false(0),使邏輯判斷代碼更加語(yǔ)義清晰ASCII·C99DataTypes&Memorysizeof運(yùn)算符與數(shù)據(jù)類型大小sizeof運(yùn)算符用于查詢數(shù)據(jù)類型或變量在內(nèi)存中所占的字節(jié)數(shù),是理解內(nèi)存布局的基礎(chǔ)工具。C標(biāo)準(zhǔn)只規(guī)定了各類型的最小范圍,實(shí)際大小因編譯器和硬件平臺(tái)而異,使用sizeof確認(rèn)是跨平臺(tái)編程的最佳實(shí)踐。常見(jiàn)數(shù)據(jù)類型字節(jié)大小(典型64位系統(tǒng))數(shù)據(jù)類型字節(jié)數(shù)典型取值范圍char1-128~127short2-32,768~32,767int4-2,147,483,648~2,147,483,647longlong8約±9.2×101?float4約±3.4×103?(7位精度)double8約±1.7×103??(15位精度)※數(shù)據(jù)類型大小決定了內(nèi)存占用和數(shù)值范圍,選擇合適類型是高效編程的基礎(chǔ)CFUNDAMENTALS變量的聲明與初始化變量是內(nèi)存中有名字的存儲(chǔ)單元,使用前必須先聲明類型以確定分配空間大小。聲明格式類型名后跟變量名,編譯器根據(jù)類型自動(dòng)分配對(duì)應(yīng)大小的內(nèi)存空間,這是C語(yǔ)言變量使用的基礎(chǔ)語(yǔ)法。intage;初始化賦值聲明變量時(shí)直接賦予初始值,避免未初始化變量含有隨機(jī)垃圾數(shù)據(jù),確保程序運(yùn)行的確定性。floatpi=3.14;批量聲明同類型多個(gè)變量可用逗號(hào)分隔一次性聲明,代碼更簡(jiǎn)潔。復(fù)雜場(chǎng)景建議每行聲明一個(gè)變量以增強(qiáng)可讀性。inta,b,c;const常量使用const修飾的變量在初始化后不可修改,編譯器會(huì)強(qiáng)制保護(hù),適用于數(shù)學(xué)常數(shù)、配置參數(shù)等固定值場(chǎng)景。constintPI=3;變量作用域變量分為局部變量和全局變量,作用域決定其可見(jiàn)范圍。同名變量在作用域重疊時(shí),局部變量?jī)?yōu)先訪問(wèn)。intglobal;Constants&TypeCasting常量表示與類型轉(zhuǎn)換C語(yǔ)言支持多種常量表示形式(整型、浮點(diǎn)、字符、字符串),并通過(guò)后綴精確控制常量類型。類型轉(zhuǎn)換分為編譯器自動(dòng)執(zhí)行的隱式轉(zhuǎn)換和程序員手動(dòng)指定的強(qiáng)制轉(zhuǎn)換,理解轉(zhuǎn)換規(guī)則是避免精度丟失和數(shù)據(jù)溢出的關(guān)鍵。整型與浮點(diǎn)后綴整型常量可加后綴指定類型:42L為long、42U為unsignedint、42ULL為unsignedlonglong;浮點(diǎn)常量默認(rèn)double,加f后綴變?yōu)閒loat42ULL·3.14f字符與字符串字符常量用單引號(hào)括起(如'A'存儲(chǔ)ASCII碼65),字符串用雙引號(hào)(如"Hello"實(shí)際存儲(chǔ)5字符加末尾自動(dòng)添加的'\0'結(jié)束符)'A'·"Hello"隱式類型轉(zhuǎn)換由編譯器自動(dòng)執(zhí)行,遵循"小類型向大類型提升"規(guī)則:char→short→int→long→float→double,運(yùn)算結(jié)果取兩者中較大的類型char→double強(qiáng)制類型轉(zhuǎn)換用(目標(biāo)類型)表達(dá)式實(shí)現(xiàn),如(int)3.99截?cái)酁?而非四舍五入;從大類型轉(zhuǎn)小類型可能導(dǎo)致數(shù)據(jù)溢出或精度丟失(int)3.99→3FUNDAMENTALS算術(shù)、關(guān)系與邏輯運(yùn)算符C語(yǔ)言的運(yùn)算符體系分為算術(shù)運(yùn)算(數(shù)值計(jì)算)、關(guān)系運(yùn)算(大小比較)和邏輯運(yùn)算(條件組合)三大類。理解每類運(yùn)算符的行為細(xì)節(jié)——特別是整數(shù)除法的截?cái)嘁?guī)則和邏輯運(yùn)算的短路特性——是編寫正確表達(dá)式的前提。ARITHMETIC算術(shù)運(yùn)算符+-*/加+-*與數(shù)學(xué)一致;除法/在兩端均為整數(shù)時(shí)執(zhí)行整除(7/2=3),至少一端為浮點(diǎn)數(shù)時(shí)才執(zhí)行浮點(diǎn)除法%取模%僅用于整數(shù)運(yùn)算,返回余數(shù)(7%2=1),常用于判斷奇偶性、實(shí)現(xiàn)循環(huán)隊(duì)列和進(jìn)制轉(zhuǎn)換+?×÷%RELATIONAL關(guān)系運(yùn)算符><>=<===!====><>=<===!=比較結(jié)果為1(真)或0(假),注意==是判斷而=是賦值==fabs(a-b)<1e-6浮點(diǎn)數(shù)比較不應(yīng)直接用==(因精度誤差),而應(yīng)判斷差值是否在極小范圍內(nèi)(如fabs(a-b)<1e-6)==≠<>LOGICAL邏輯運(yùn)算符&&||&&(與)和||(或)具有短路特性:左側(cè)已能確定結(jié)果時(shí)右側(cè)不執(zhí)行,可避免空指針訪問(wèn)!!(非)將真值取反,非零值取反為0,零值取反為1;C語(yǔ)言中任何非零值都被視為"真"&&||!Operators賦值運(yùn)算符與自增自減復(fù)合賦值運(yùn)算符(+=、-=、*=等)將運(yùn)算與賦值合為一步,使代碼更簡(jiǎn)潔高效。自增++和自減--運(yùn)算符分前綴和后綴兩種形式,核心區(qū)別在于'先運(yùn)算后使用'還是'先使用后運(yùn)算'——理解這一時(shí)序差異是避免表達(dá)式計(jì)算錯(cuò)誤的關(guān)鍵。01基本賦值運(yùn)算符=將右側(cè)表達(dá)式的值存入左側(cè)變量,連續(xù)賦值從右向左執(zhí)行,如a=b=5先給b賦值再給a賦值。a=b=502復(fù)合賦值運(yùn)算符將算術(shù)運(yùn)算與賦值合并:a+=3等價(jià)于a=a+3,同理支持-=、*=、/=、%=,代碼更簡(jiǎn)潔且編譯效率更高。+=?=*=/=%=03前綴與后綴前綴++a先加1再返回新值,后綴a++先返回當(dāng)前值再加1——獨(dú)立語(yǔ)句中效果相同,表達(dá)式中結(jié)果不同。++avsa++04安全實(shí)踐復(fù)雜表達(dá)式中避免混用多個(gè)++/--(如a+++b++),不同編譯器求值順序可能不一致,應(yīng)拆分為多條清晰語(yǔ)句。a+++b++C·I/OFunctions標(biāo)準(zhǔn)輸入輸出函數(shù)printf和scanf是C語(yǔ)言最核心的I/O函數(shù),通過(guò)格式占位符(%d、%f、%c、%s等)實(shí)現(xiàn)數(shù)據(jù)的格式化輸出與輸入。掌握格式控制語(yǔ)法和scanf的地址傳遞機(jī)制,是編寫交互式程序的基本功。printf格式化輸出??常用占位符%d整數(shù)·%f浮點(diǎn)數(shù)(默認(rèn)6位)·%c字符·%s字符串·%x十六進(jìn)制·%o八進(jìn)制??寬度與精度控制%10d%-10d%.2f%05d%10d右對(duì)齊占10位%-10d左對(duì)齊%.2f保留2位小數(shù)%05d不足5位前補(bǔ)零%8.2f格式控制符可靈活組合,如%8.2f表示總寬8位、保留2位小數(shù)的右對(duì)齊浮點(diǎn)數(shù)scanf格式化輸入??地址傳遞機(jī)制scanf("%d",&age)變量前必須加取地址符&,如scanf("%d",&age),函數(shù)需要知道將輸入數(shù)據(jù)存入哪個(gè)內(nèi)存地址??讀取行為與返回值?遇到空格/Tab/回車即停止讀取?返回成功讀取的項(xiàng)數(shù),可用于驗(yàn)證輸入合法性?忽略返回值易導(dǎo)致程序因非法輸入崩潰常見(jiàn)錯(cuò)誤:忘記寫&、格式字符串與變量類型不匹配、未處理scanf返回值導(dǎo)致緩沖區(qū)殘留Chapter03控制流語(yǔ)句與函數(shù)掌握程序的邏輯控制能力——分支判斷、循環(huán)執(zhí)行與模塊化設(shè)計(jì)CONTROLFLOW分支語(yǔ)句:if-else與switch分支語(yǔ)句賦予程序根據(jù)條件選擇執(zhí)行路徑的能力。if-else適合范圍判斷和復(fù)雜條件組合,switch適合對(duì)單一變量的離散值進(jìn)行多路匹配。兩者互為補(bǔ)充,合理選擇能讓代碼邏輯更清晰、維護(hù)更容易。if-else條件分支if(條件)執(zhí)行代碼塊,條件為假時(shí)跳過(guò);可通過(guò)elseif串聯(lián)多個(gè)互斥條件,else處理所有剩余情況,形成完整的多路判斷嵌套if層數(shù)不宜超過(guò)3層,過(guò)深嵌套會(huì)降低可讀性——可考慮提前return、合并條件或改用switch來(lái)簡(jiǎn)化邏輯結(jié)構(gòu)≤3層嵌套switch多路選擇switch根據(jù)整型表達(dá)式的值跳轉(zhuǎn)到匹配的case分支執(zhí)行,適合處理菜單選擇、狀態(tài)機(jī)等離散值判斷場(chǎng)景,代碼比長(zhǎng)串if-else更清晰每個(gè)case末尾必須加break防止"穿透"到下一個(gè)case(忘記break是經(jīng)典bug);default分支處理所有未匹配的值,相當(dāng)于if-else中的elsebreak+defaultCONTROLFLOW循環(huán)語(yǔ)句:for、while與do-while三種循環(huán)結(jié)構(gòu)各有適用場(chǎng)景:for循環(huán)適合已知次數(shù)的迭代,while循環(huán)適合條件驅(qū)動(dòng)的重復(fù)執(zhí)行,do-while保證循環(huán)體至少執(zhí)行一次。配合break和continue控制語(yǔ)句,可以靈活管理循環(huán)的執(zhí)行流程。for循環(huán)初始化、條件判斷和更新集中在頭部,結(jié)構(gòu)緊湊,已知循環(huán)次數(shù)的首選已知次數(shù)while循環(huán)先判斷條件再執(zhí)行,條件為假時(shí)不執(zhí)行,適合不確定次數(shù)的迭代條件驅(qū)動(dòng)do-while先執(zhí)行再判斷,保證至少執(zhí)行一次,常用于輸入驗(yàn)證場(chǎng)景至少一次break/continuebreak終止整個(gè)循環(huán),continue跳過(guò)當(dāng)前迭代,實(shí)現(xiàn)精細(xì)控制精細(xì)控制避免死循環(huán)確保條件最終為假或設(shè)置break退出,無(wú)限循環(huán)僅限特殊場(chǎng)景安全退出ProgrammingFundamentals嵌套循環(huán)與典型編程應(yīng)用嵌套循環(huán)通過(guò)在外層循環(huán)體內(nèi)嵌入內(nèi)層循環(huán)來(lái)處理多維度重復(fù)任務(wù),總執(zhí)行次數(shù)為各層次數(shù)的乘積。乘法表打印和素?cái)?shù)判斷是兩個(gè)經(jīng)典案例,體現(xiàn)了"理清重復(fù)邏輯、設(shè)置終止條件"的核心編程思維。01嵌套執(zhí)行機(jī)制外層循環(huán)每執(zhí)行一次,內(nèi)層循環(huán)完整執(zhí)行一遍。以九九乘法表為例,外層控制行(1-9),內(nèi)層控制列(1-行號(hào)),共執(zhí)行45次輸出。這種層級(jí)結(jié)構(gòu)清晰體現(xiàn)了"重復(fù)中的重復(fù)"這一核心概念。02性能影響嵌套層數(shù)增加會(huì)指數(shù)級(jí)放大執(zhí)行次數(shù):雙重n次循環(huán)為n2次,三重則為n3次。算法設(shè)計(jì)中應(yīng)盡量減少嵌套層數(shù),優(yōu)先選用更高效的數(shù)據(jù)結(jié)構(gòu)或算法策略,以顯著提升程序運(yùn)行性能。03素?cái)?shù)判斷循環(huán)從2遍歷到√n檢查是否有因子,發(fā)現(xiàn)可整除則用break提前退出,避免不必要的計(jì)算。這一優(yōu)化將時(shí)間復(fù)雜度從O(n)降至O(√n),是"提前終止"策略的典型應(yīng)用,大幅提升了算法效率。04累加與計(jì)數(shù)用循環(huán)遍歷數(shù)據(jù)集并維護(hù)累加器(sum+=value)或計(jì)數(shù)器(滿足條件時(shí)count++),是統(tǒng)計(jì)計(jì)算的基本模式。配合條件判斷可實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)篩選與聚合操作,廣泛應(yīng)用于報(bào)表生成和數(shù)據(jù)分析場(chǎng)景。CProgramming·Functions函數(shù)的定義與調(diào)用函數(shù)是C語(yǔ)言代碼復(fù)用和模塊化設(shè)計(jì)的基本單元。每個(gè)函數(shù)有明確的返回類型、名稱、參數(shù)列表和函數(shù)體。C語(yǔ)言函數(shù)采用值傳遞機(jī)制——實(shí)參的值被復(fù)制給形參,函數(shù)內(nèi)部的修改不會(huì)影響原始變量。函數(shù)定義格式返回類型函數(shù)名(參數(shù)類型形參名,...){函數(shù)體},如intadd(inta,intb){returna+b;}intadd(a,b)值傳遞機(jī)制實(shí)參的值被復(fù)制到形參中,函數(shù)內(nèi)部對(duì)形參的修改不影響原始變量,需修改原值時(shí)應(yīng)傳遞指針passbyvaluevoid與函數(shù)原型void類型函數(shù)不返回值;函數(shù)原型放在調(diào)用前或頭文件中,讓編譯器提前知道簽名以進(jìn)行類型檢查prototype遞歸函數(shù)調(diào)用自身解決問(wèn)題,必須設(shè)置基線條件防止無(wú)限遞歸,每次調(diào)用在棧上分配新的局部變量空間basecaseSCOPE&STORAGE變量作用域與存儲(chǔ)類別聲明位置與static修飾符共同決定變量的可見(jiàn)范圍和生存周期。作用域規(guī)則局部變量在函數(shù)或代碼塊內(nèi)聲明,僅塊內(nèi)可見(jiàn),函數(shù)返回后自動(dòng)銷毀,未初始化時(shí)為不確定的垃圾值。生命周期隨函數(shù)調(diào)用開(kāi)始而創(chuàng)建,調(diào)用結(jié)束而釋放。棧區(qū)存儲(chǔ)作用域規(guī)則全局變量在所有函數(shù)外部聲明,整個(gè)程序均可訪問(wèn),默認(rèn)初始化為零,但過(guò)度使用會(huì)降低代碼可維護(hù)性。生命周期貫穿程序運(yùn)行的全過(guò)程。靜態(tài)區(qū)存儲(chǔ)STATIC修飾符static修飾局部變量存儲(chǔ)于靜態(tài)區(qū)而非棧區(qū),多次調(diào)用間值持續(xù)保留,適用于調(diào)用計(jì)數(shù)器等需要記憶狀態(tài)的場(chǎng)景。作用域仍限于聲明所在的代碼塊內(nèi)。狀態(tài)保持STATIC修飾符static修飾全局將可見(jiàn)范圍限制在當(dāng)前源文件內(nèi),其他文件即使extern聲明也無(wú)法訪問(wèn),有效避免命名沖突。生存周期與全局變量相同,但作用域被壓縮。文件隔離CHAPTER04數(shù)組、指針與內(nèi)存管理深入C語(yǔ)言的底層能力——數(shù)據(jù)批量存儲(chǔ)、內(nèi)存地址操控與動(dòng)態(tài)資源管理ARRAYFUNDAMENTALS一維數(shù)組的聲明與使用一維數(shù)組是在內(nèi)存中連續(xù)排列的同類型數(shù)據(jù)集合,通過(guò)下標(biāo)(從0開(kāi)始)直接訪問(wèn)元素。數(shù)組的連續(xù)內(nèi)存布局使得隨機(jī)訪問(wèn)效率極高(O(1)),但C語(yǔ)言不提供下標(biāo)越界檢查,需要程序員自行保證訪問(wèn)合法性。01聲明格式格式為類型名數(shù)組名[常量];,大小必須是編譯期常量表達(dá)式,C99起支持變長(zhǎng)數(shù)組但不推薦依賴。intarr[N]02初始化方式完全初始化{1,2,3,4,5}、部分初始化{1,2}(剩余補(bǔ)零)、自動(dòng)推斷大小inta[]={1,2,3}。{}03下標(biāo)與越界下標(biāo)從0開(kāi)始,scores[0]到scores[4]為合法范圍。C語(yǔ)言不做邊界檢查,越界可能導(dǎo)致崩潰或覆蓋相鄰內(nèi)存。[0,n)04遍歷方式標(biāo)準(zhǔn)模式為for循環(huán)配合下標(biāo)變量,結(jié)合sizeof自動(dòng)計(jì)算元素個(gè)數(shù):n=sizeof(arr)/sizeof(arr[0])。for+sizeofC語(yǔ)言程序設(shè)計(jì)基本知識(shí)二維數(shù)組與多維數(shù)組二維數(shù)組本質(zhì)上是"數(shù)組的數(shù)組",以行優(yōu)先方式在內(nèi)存中連續(xù)存儲(chǔ)。它天然適合表示矩陣、表格和網(wǎng)格等二維結(jié)構(gòu)數(shù)據(jù),通過(guò)雙重下標(biāo)[i][j]精確定位元素,是矩陣運(yùn)算和圖像處理的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。聲明格式類型名數(shù)組名[行數(shù)][列數(shù)],初始化可用嵌套花括號(hào)逐行賦值。例如inta[3][4]聲明3行4列的整型數(shù)組。3×4內(nèi)存布局行優(yōu)先連續(xù)存儲(chǔ),地址=首地址+(i×列數(shù)+j)×元素大小。二維數(shù)組在內(nèi)存中實(shí)際展開(kāi)為一維線性結(jié)構(gòu)。i×N+j雙重遍歷外層控制行索引,內(nèi)層控制列索引,總訪問(wèn)次數(shù)為行數(shù)×列數(shù)。嵌套循環(huán)是遍歷二維數(shù)組的標(biāo)準(zhǔn)模式。M×N應(yīng)用場(chǎng)景矩陣運(yùn)算、圖像像素處理、棋盤狀態(tài)存儲(chǔ)與動(dòng)態(tài)規(guī)劃狀態(tài)表。廣泛應(yīng)用于科學(xué)計(jì)算與游戲開(kāi)發(fā)領(lǐng)域。8×8CLANGUAGE·STRINGS字符串的本質(zhì)與常用操作C語(yǔ)言的字符串是以'\0'空字符結(jié)尾的字符數(shù)組,沒(méi)有獨(dú)立的字符串類型。所有字符串操作依賴\0定位結(jié)束位置,這使得緩沖區(qū)管理成為程序員的責(zé)任。字符串底層原理char'\0'chars[]="Hello"字符串是char數(shù)組+'\0'結(jié)束符:chars[]="Hello"占6字節(jié)(5個(gè)字符+1個(gè)\0),\0是ASCII碼0,所有字符串函數(shù)靠它確定終點(diǎn)。chars[]="Hi"char*p="Hi"字符數(shù)組與字符串常量的區(qū)別:chars[]="Hi"可修改,char*p="Hi"指向只讀區(qū)——修改字符串常量會(huì)導(dǎo)致段錯(cuò)誤(SegmentationFault)。Memory'\0'終止string.h常用函數(shù)strlen(s)strcpy(dst,src)strcatstrcmp(a,b)strlen(s)返回長(zhǎng)度(不含\0)、strcpy(dst,src)復(fù)制、strcat拼接、strcmp(a,b)比較——相等返回0,a<b返回負(fù)值。strncpystrncatsnprintf安全版本:strncpy、strncat增加長(zhǎng)度限制參數(shù)防止溢出,snprintf格式化寫入時(shí)限制最大字節(jié)數(shù),現(xiàn)代開(kāi)發(fā)中應(yīng)優(yōu)先使用。Security安全函數(shù)優(yōu)先CHAPTER04·POINTERS指針的概念與基本操作指針是存儲(chǔ)內(nèi)存地址的特殊變量,是C語(yǔ)言直接操控底層內(nèi)存的核心工具。01指針聲明:類型名后加*號(hào)(如int*p;),p存儲(chǔ)一個(gè)int變量的內(nèi)存地址,指針大小在64位系統(tǒng)上為8字節(jié)02取地址&與解引用*:&獲取變量地址(p=&a;),*通過(guò)地址訪問(wèn)或修改目標(biāo)值(*p=10即修改a為10)03三個(gè)關(guān)鍵區(qū)分:p是指針變量(存地址)、*p是所指向的數(shù)據(jù)(解引用)、&p是指針自身的地址04空指針NULL:值為0表示不指向有效地址,使用前應(yīng)檢查(if(p!=NULL)),解引用空指針會(huì)導(dǎo)致程序崩潰計(jì)算機(jī)內(nèi)存條實(shí)物·每個(gè)字節(jié)對(duì)應(yīng)唯一的內(nèi)存地址POINTER&ARRAY指針與數(shù)組的深層關(guān)系數(shù)組名在表達(dá)式中自動(dòng)退化為指向首元素的指針常量,arr[i]本質(zhì)上是*(arr+i)的語(yǔ)法糖。指針?biāo)阈g(shù)運(yùn)算會(huì)自動(dòng)按元素大小步進(jìn),使得指針遍歷連續(xù)內(nèi)存極為高效——這一設(shè)計(jì)是C語(yǔ)言高性能的根本原因之一。EQUIVALENCE數(shù)組名≡首元素地址arr與&arr[0]值相同,但arr是常量指針不可自增改變指向,普通指針變量則可自由移動(dòng)常量指針SUGAR下標(biāo)即指針運(yùn)算arr[i]編譯時(shí)轉(zhuǎn)換為*(arr+i),即從首地址偏移i個(gè)元素后解引用——下標(biāo)只是便利寫法*(arr+i)STEPSIZE算術(shù)按類型步進(jìn)int*p指向1000時(shí)p+1為1004(占4字節(jié)),char*p時(shí)p+1為1001(占1字節(jié))4字節(jié)PASSBYPTR傳參實(shí)為傳指針函數(shù)參數(shù)intarr[]等價(jià)于int*arr,sizeof返回指針大小而非數(shù)組總大小,需額外傳入長(zhǎng)度int*arrCHAPTER29·ADVANCEDPOINTERS指針的進(jìn)階應(yīng)用指針使C語(yǔ)言函數(shù)能夠通過(guò)地址直接修改調(diào)用者的數(shù)據(jù)(地址傳遞),突破了值傳遞的單向性限制。函數(shù)指針則將函數(shù)作為一等公民——可以存儲(chǔ)、傳遞和動(dòng)態(tài)調(diào)用,是實(shí)現(xiàn)回調(diào)機(jī)制、事件驅(qū)動(dòng)和策略模式等高級(jí)編程范式的基礎(chǔ)。地址傳遞與數(shù)據(jù)修改直接修改原變量:swap(&a,&b)通過(guò)解引用交換兩個(gè)值,而swap(a,b)只能交換函數(shù)內(nèi)部的副本,無(wú)法影響外部變量返回多個(gè)值:C函數(shù)只能return一個(gè)值,但通過(guò)指針參數(shù)可以"帶回"多個(gè)結(jié)果,如intdivide(inta,intb,int*remainder)同時(shí)返回商和余數(shù)swap(&a,&b)函數(shù)指針與回調(diào)聲明與調(diào)用:int(*fp)(int,int)定義指向"接收兩個(gè)int返回int"函數(shù)的指針,賦值fp=add后可通過(guò)fp(3,5)調(diào)用函數(shù)回調(diào)機(jī)制:將函數(shù)指針作為參數(shù)傳入,如qsort的比較函數(shù),使通用算法能適配不同的業(yè)務(wù)邏輯,是C語(yǔ)言實(shí)現(xiàn)多態(tài)的核心手段int(*fp)(int,int)C語(yǔ)言程序設(shè)計(jì)基本知識(shí)動(dòng)態(tài)內(nèi)存分配與管理動(dòng)態(tài)內(nèi)存分配允許程序在運(yùn)行時(shí)按需從堆區(qū)申請(qǐng)內(nèi)存(malloc/calloc),用完后通過(guò)free歸還。與棧區(qū)的自動(dòng)管理不同,堆區(qū)內(nèi)存的生命周期完全由程序員控制——忘記釋放導(dǎo)致內(nèi)存泄漏,重復(fù)釋放導(dǎo)致程序崩潰,手動(dòng)管理是C語(yǔ)言強(qiáng)大但危險(xiǎn)的雙刃劍。malloc—堆內(nèi)存分配malloc(size)從堆區(qū)分配size字節(jié)的未初始化內(nèi)存,返回void*需強(qiáng)制轉(zhuǎn)換:int*p=(int*)malloc(n*sizeof(int));分配失敗時(shí)返回NULLmalloc(size)calloc/realloc—初始化與調(diào)整calloc(count,size)分配count×size字節(jié)并全部初始化為0,適合需要清零的場(chǎng)景;realloc(ptr,newSize)調(diào)整已有內(nèi)存塊大小,可能搬遷到新地址calloc·reallocfree—釋放與懸空指針free(ptr)釋放之前malloc/calloc分配的內(nèi)存,釋放后ptr變?yōu)閼铱罩羔槪ㄈ灾赶蛞褮w還的地址),應(yīng)立即設(shè)為NULL(ptr=NULL)防止誤用ptr=NULL常見(jiàn)內(nèi)存錯(cuò)誤內(nèi)存泄漏(malloc后未free)、雙重釋放(對(duì)同一地址free兩次)、野指針(使用未初始化或已釋放的指針)、越界訪問(wèn)(寫入超出分配范圍)4類典型錯(cuò)誤Chapter·DataStructures結(jié)構(gòu)體:組織復(fù)雜數(shù)據(jù)結(jié)構(gòu)體(struct)將不同類型的數(shù)據(jù)成員組合為一個(gè)整體,是C語(yǔ)言模擬"對(duì)象"概念的核心機(jī)制。01·定義與使用復(fù)合類型打包struct將char/int/float等不同類型字段組合為統(tǒng)一的復(fù)合數(shù)據(jù)類型成員訪問(wèn)與別名點(diǎn)運(yùn)算符訪問(wèn)成員(stu.age),箭頭運(yùn)算符通過(guò)指針訪問(wèn)(p→age),typedef起別名簡(jiǎn)化聲明02·進(jìn)階應(yīng)用結(jié)構(gòu)體嵌套成員可以是另一個(gè)結(jié)構(gòu)體類型(如Student中包含Address),實(shí)現(xiàn)層次化數(shù)據(jù)建模鏈表與動(dòng)態(tài)結(jié)構(gòu)結(jié)合指針成員(structNode*next)構(gòu)建鏈表、樹(shù)、圖,突破數(shù)組固定大小限制student.htypedefstruct{charname[20];intage;floatscore;}Student;/*點(diǎn)運(yùn)算符訪問(wèn)*/Studentstu;stu.age=20;/*箭頭運(yùn)算符(指針)*/Student*p=&stu;p->score=95.5;/*嵌套結(jié)構(gòu)體*/typedefstruct{charcity[30];intzip;}Address;typedefstruct{charname[20];Addressaddr;}Person;struct·typedef·pointerMEMORYLAYOUTC程序的內(nèi)存區(qū)域劃分C程序運(yùn)行時(shí)內(nèi)存分為代碼區(qū)、靜態(tài)區(qū)、棧區(qū)和堆區(qū)四大區(qū)域,各有不同的管理方式和生命周期特征。理解這一內(nèi)存布局是掌握變量行為、指針操作和內(nèi)存bug排查的底層知識(shí)基礎(chǔ)。C程序內(nèi)存區(qū)域?qū)Ρ葍?nèi)存區(qū)域存儲(chǔ)內(nèi)容管理方式生命周期代碼區(qū)編譯后的機(jī)器指令只讀,系統(tǒng)加載程序啟動(dòng)到結(jié)束靜態(tài)區(qū)全局變量、static變量編譯器分配

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論