freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c程序設(shè)計第四章ppt西工大-資料下載頁

2025-01-12 07:43本頁面
  

【正文】 ?5.堆 ?堆( heap)用來存放 C程序中動態(tài)分配的存儲空間。 103 程序映像和內(nèi)存布局 ?5.堆 ?程序映像中沒有堆,在程序開始運(yùn)行時不會分配堆,函數(shù)調(diào)用時也不會分配堆。堆的存儲空間分配和釋放是通過指定的程序方式來進(jìn)行的,即由程序員使用指令分配和釋放,若程序員不釋放,程序結(jié)束可能由操作系統(tǒng)回收。 ?C語言中可以通過使用指針、動態(tài)內(nèi)存分配和釋放函數(shù)來實(shí)現(xiàn)堆的分配和釋放,詳見第 7章。程序可以通過動態(tài)內(nèi)存分配和釋放來使用堆區(qū),堆區(qū)有比棧更大的存儲空間、更自由的使用方式。 104 程序映像和內(nèi)存布局 ?堆和棧的共同點(diǎn)是動態(tài)存儲,處于這兩個區(qū)域的存儲單元可以隨時分配和釋放,所以這些存儲單元的使用特點(diǎn)呈現(xiàn)臨時性的特點(diǎn)。 105 程序映像和內(nèi)存布局 ?堆和棧的區(qū)別是分配方式的不同 ?棧是編譯器根據(jù)程序代碼自動確定大小,到函數(shù)調(diào)用時有指令自動完成分配和釋放的;堆則完全由程序員指定分配大小、何時分配、何時釋放。 ?堆的優(yōu)點(diǎn)是分配和釋放是自由的,缺點(diǎn)是需要程序員自行掌握分配和釋放時機(jī),特別是釋放時機(jī),假如已經(jīng)釋放了還要使用堆會產(chǎn)生引用錯誤,或者始終沒有釋放產(chǎn)生內(nèi)存泄漏( memory leak)。 總結(jié) ? 一個 C程序所占內(nèi)存可分為: 棧:編譯器分配存儲函數(shù)參數(shù), 函數(shù)局部變量等 在程序開始時不分配,當(dāng)函數(shù)調(diào)用時分配局部變量存儲空間 堆:由程序的指定方式分配和回收, 例如動態(tài)分配和釋放、 指針進(jìn)行。 malloc, free函數(shù) 在程序開始時不分配,當(dāng)函數(shù)調(diào)用時不分配。不釋放 就一直存在程序運(yùn)行期間, 全局區(qū):存放全局變量和靜態(tài)變量 文字常量區(qū): char * p = ? 12345? 程序代碼區(qū):存放程序的二進(jìn)制代碼 程序結(jié)束后由系統(tǒng)釋放 程序結(jié)束后由系統(tǒng)釋放 程序結(jié)束后由系統(tǒng)釋放,可共享 107 生命期 ?3.自動對象 ?默認(rèn)情況下,函數(shù)或復(fù)合語句中的對象(包含形參)稱為自動對象( automatic objects),其存儲方式是自動存儲,程序中大多數(shù)對象是自動存儲。 auto 類型 變量名 [=初值 ], ...... 108 生命期 ?4.寄存器變量 ?C語言允許用 CPU的寄存器來存放局部變量,稱為寄存器變量。在局部變量前加上 register存儲類別修飾來定義的,其形式為: register 類型 變量名 [=初值 ], ...... 109 生命期 ?5.靜態(tài)局部對象 ?在局部對象的前面加上 static存儲類別修飾用來指明對象是靜態(tài)局部對象( static local object),一般形式為: static 類型 變量名 [=初值 ] , ...... 110 生命期 ? auto:對局部變量無特殊要求時采用;特點(diǎn)是函 數(shù)被調(diào)用時動態(tài)分配、釋放,可節(jié)省內(nèi)存資源; ? static:若函數(shù)調(diào)用結(jié)束后,希望能保留已有值 以便下次調(diào)用時繼續(xù)引用,采用該類別可達(dá)目的; 因?yàn)椋? 靜態(tài)局部變量在程序的整個運(yùn)行期間始終在靜 態(tài)存儲區(qū)占據(jù)著固定的存儲單元,但 只有發(fā)生函數(shù) 調(diào)用時才可對其引用或賦值 ,函數(shù)調(diào)用結(jié)束它仍然保存其值和存儲單元,函數(shù)再次被調(diào)用時又可繼續(xù)引用。 注: 全局變量也可達(dá)此目的,但有效范圍內(nèi)的函數(shù)都可使用,因此盡量少用。 如: int fun(int a) { auto int b, c=3。 //調(diào)用時分配單元并賦初值 static int x, y=1。 //編譯時分配單元并賦初值 ┇ } 說明: 靜態(tài)局部變量 x、 y存儲單元的分配和 y賦初值 是一次性的,函數(shù)調(diào)用結(jié)束不會釋放。 x, y a, b, c 靜態(tài)存儲區(qū) 動態(tài)存儲區(qū) 【 例 】 求 1+2+3+…+n long fun1(int k) k: 動態(tài)存儲區(qū) { static long s=0。 s=s+k。 s: 靜態(tài)存儲區(qū) return s。 } //返回階段累加和 int main( ) { int n, i。 long sum, fun1(int)。 printf(Enter a number:)。 scanf(%d, amp。n)。 //輸入 5?n for(i=1。 i=n。 i++) sum=fun1(i)。 printf(1+2+…+%d=%d\n, n, sum)。 return 0。 } 0 13610 151 23 45【 例 】 定義高效的求階乘函數(shù),求多個整數(shù)的階乘。 思路: 1) 多個整數(shù)由鍵盤輸入至 n: 2, 5, 5, 3, 8 2) 循環(huán)中階乘函數(shù)的調(diào)用: f=fact(n)。 循環(huán)變量 i取值: 2…5 3) fact函數(shù)需要保留的數(shù): 上一個數(shù) ? 靜態(tài)局部變量 n0 上一個數(shù)的階乘值 ? 靜態(tài)局部變量 f 4) fact函數(shù) 分支處理情況: 當(dāng)前數(shù) 上一個數(shù) 、 當(dāng)前數(shù) 上一個數(shù) 、 當(dāng)前數(shù) ==上一個數(shù) 源程序: include long fact(int)。 int main( ) { int n, i。 long f。 for(i=1。 i=5。 i++) { scanf(”%d,”, amp。n)。 // 2, 5, 5, 3, 8 f=fact(n)。 printf(\t%d!=%ld\n, n, f)。 } return 0。 } long fact(int n) { …… } … f=fact(n)。 … // 典型數(shù)據(jù) 2, 5, 5, 3, 8 long fact(int n) { int i。 static long f=1, n0=0。 f: if(n==n0) return(f)。 n0: else if(nn0) i=n0+1。 else { f=1。 i=1。} for( 。 i=n。 i++) f=f*i。 n0=n。 //保存本次形參值供下次比較用 return(f)。 } ┇ 1 0 ┇ 靜態(tài)存儲區(qū) 2 2 120 51 6340320 8SX0411 117 生命期 例 1 include 2 int fun() 3 { 4 static int t=0。//靜態(tài)局部變量會保持其值 5 t++。 6 return t。 7 } 8 int main() 9 { 10 int i,c。 11 for (i=1。i=10。i++) c=fun()。 12 printf(%d\n,c)。 13 return 0。 14 } 118 程序組織結(jié)構(gòu) ?內(nèi)部函數(shù) ?函數(shù)本質(zhì)上是全局的,在多文件的程序中,在連接時會檢查函數(shù)在全局作用域內(nèi)是否名字唯一,如果不是則出現(xiàn)連接錯誤。 ?在函數(shù)定義前加上 static修飾,則函數(shù)稱為內(nèi)部函數(shù),定義形式為: static 返回類型 函數(shù)名 (形式參數(shù)列表 ) { 函數(shù)體 } 119 內(nèi)部函數(shù) ?按照前面的實(shí)體可見規(guī)則,內(nèi)部函數(shù)僅在包含它的文件中有效。 ?之所以使用內(nèi)部函數(shù)的原因是該函數(shù)邏輯上僅限定在一個文件中使用,其他文件不會用到。而且希望連接檢查時永遠(yuǎn)不可能出現(xiàn)該函數(shù)名不唯一的連接錯誤,這在多人編寫同一個程序的軟件開發(fā)模式中是常用的策略。 120 外部函數(shù) ?外部函數(shù) ?在函數(shù)定義前加上 extern聲明,則函數(shù)稱為外部函數(shù),定義形式為: ?C語言中所有的函數(shù)本質(zhì)上都是外部函數(shù)。因此,上面的 extern都可以省略。 extern 返回類型 函數(shù)名 (形式參數(shù)列表 ) { 函數(shù)體 } 121 多文件結(jié)構(gòu) 圖 多文件程序結(jié)構(gòu) 多文件結(jié)構(gòu)、 內(nèi)部函數(shù)與外部函數(shù) 1) 內(nèi)部函數(shù) ——用 static標(biāo)識的函數(shù),只能被本源程 序文件中的函數(shù)調(diào)用; 例: static float f1(int x, int y) //限定 f1不對外 { …… } 2) 外部函數(shù) ——不作標(biāo)識 的函數(shù),允許被其它源程 序文件中的函數(shù)調(diào)用;但必須在調(diào) 用的源文件中作 外部函數(shù)聲明 ; 例: int fun1(int x) extern int fun1(int x)。 { …… } ┇ 【 例 】 定義函數(shù)可求三個數(shù)中的最大 、 最小及平均值;要求:在 main中實(shí)現(xiàn)輸入 、 輸出 。 程序的兩個 函數(shù)分別編制在 。 —— include int main() { int a,b,c。 double aver。 extern double f1(int, int, int)。 //外部函數(shù)聲明 scanf(%d%d%d, amp。a,amp。b,amp。c)。 aver=f1(a,b,c)。 printf(Aver=%.2f , aver)。 //引用全局變量 return 0。 } —— double f1(int a, int b, int c) { double aver。 aver=(a+b+c)/。 return aver。 } SX0412 125 頭文件與工程文件 ?1.頭文件 ?為什么要使用頭文件呢? ?我們現(xiàn)在已經(jīng)知道,如果是多文件結(jié)構(gòu)程序,欲在文件中調(diào)用別的文件中的函數(shù),需要有函數(shù)的聲明,而且每個文件均是如此。如果是函數(shù)聲明比較多的情況下,在每個文件中都寫上函數(shù)聲明不是好辦法,很難管理。例如:某個函數(shù)定義有變動,那么所有含有這個函數(shù)聲明的調(diào)用文件都需要找出來,逐一修改。 126 頭文件與工程文件 ?為什么要使用頭文件呢? ?使用頭文件可以解決這個問題,其工作原理是通過將每個源文件中外部函數(shù)的函數(shù)聲明等信息集中寫到一個文件中,稱為頭文件(有別于源文件),而別的源文件只需用文件包含命令將這個頭文件包含,則編譯時編譯器自然就有了函數(shù)聲明。 127 頭文件與工程文件 圖 多源文件時頭文件的處理示意 128 頭文件與工程文件 ?2.工程文件 ?多文件結(jié)構(gòu)程序在編譯時需要工程文件來管理,不同的編譯器有不同的工程文件格式。 129 頭文件與工程文件 圖 CodeBlocks工程文件管理 130 提高編譯速度 ?提高編譯速度 ?( 1)預(yù)編譯頭文件 ?( 2)增量編譯 ?( 3)編譯緩存 Poj題目講解 131 unsigned char c1。 scanf(“%u”, amp。c1)。 Inline int xchg(unsigned char n) 例如: 0110 0111 0111 0110 低四位和高四位交換 位運(yùn)算: ?aamp。b 相同位的兩個數(shù)字都為 1,則為 1;若有一個不為 1,則為 0。 ?a|b 相同位只要一個為 1即為 1。 ?a ^ b 相同位不同則為 1,相同則為 0。 ?~a 取反, 0取反是 1, 1取反是
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1