c語言函數(shù)ppt課件.ppt_第1頁
c語言函數(shù)ppt課件.ppt_第2頁
c語言函數(shù)ppt課件.ppt_第3頁
c語言函數(shù)ppt課件.ppt_第4頁
c語言函數(shù)ppt課件.ppt_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

模塊化程序設(shè)計基本思想 將一個大的程序按功能分割成一些小模塊 特點 各模塊相對獨立 功能單一 結(jié)構(gòu)清晰 接口簡單控制了程序設(shè)計的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動易于維護和功能擴充 第六章函數(shù) C是模塊化程序設(shè)計語言 C程序結(jié)構(gòu) C是函數(shù)式語言必須有且只能有一個名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始 在main中結(jié)束函數(shù)不能嵌套定義 可以嵌套調(diào)用 例 在C程序中 函數(shù)既可以嵌套定義 也可以嵌套調(diào)用 函數(shù)分類從用戶角度標(biāo)準(zhǔn)函數(shù) 庫函數(shù) 由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù) 使用庫函數(shù)應(yīng)注意 1 函數(shù)功能2 函數(shù)參數(shù)的數(shù)目和順序 及各參數(shù)意義和類型3 函數(shù)返回值意義和類型4 需要使用的包含文件 Ch7 201 c 6 1函數(shù)一 函數(shù)的定義一般格式 合法標(biāo)識符 函數(shù)返回值類型缺省int型無返回值void 函數(shù)體 例有參函數(shù) 現(xiàn)代風(fēng)格 intmax intx inty intz z x y x y return z 例無參函數(shù)printstar printf n 或printstar void printf n 返回語句形式 return 表達(dá)式 或return表達(dá)式 或return 功能 使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中 同時把返值帶給調(diào)用函數(shù)說明 函數(shù)中可有多個return語句若無return語句 遇 時 自動返回調(diào)用函數(shù)若函數(shù)類型與return語句中表達(dá)式值的類型不一致 按前者為準(zhǔn) 自動轉(zhuǎn)換 函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù) 例無返回值函數(shù)voidsx inty inttemp temp x x y y temp 例 編寫程序 輸入一個正整數(shù)n 求下列算式的值 要求定義和調(diào)用函數(shù)fact k 計算k的階乘 函數(shù)返回值的類型是double 2006年春試題 doublefact intk doubles 0 inti t 1 for i 1 i k i t t i s s 1 0 t returns 二 函數(shù)的調(diào)用調(diào)用形式函數(shù)名 實參表 說明 實參與形參個數(shù)相等 類型一致 按順序一一對應(yīng)實參表求值順序 因系統(tǒng)而定 TurboC自右向左 includemain intn doublesum scanf d 調(diào)用方式函數(shù)語句 例printstar printf Hello World n 函數(shù)表達(dá)式 例m max a b 2 函數(shù)參數(shù) 例printf d max a b m max a max b c main inti 2 j 2 p p f i j printf d p intf inta intb intc if a b c 1 elseif a b c 0 elsec 1 return c 例參數(shù)求值順序 運行結(jié)果 0 調(diào)用函數(shù)語句1 主調(diào)函數(shù) 主調(diào)函數(shù) Return語句或最后一個 執(zhí)行函數(shù)調(diào)用的內(nèi)涵 1 把實參的值傳給形參 2 把控制語句傳給被調(diào)函數(shù) 也就是說程序的執(zhí)行由主調(diào)函轉(zhuǎn)到被調(diào)函數(shù) 3 在函數(shù)中執(zhí)行return語句 將返回值帶回到主調(diào)函數(shù) printstar printf main inta a printstar printf d a 例函數(shù)帶回不確定值 輸出 10 voidprintstar printf main inta a printstar printf d a 編譯錯誤 例函數(shù)返回值類型轉(zhuǎn)換 main floata b intc scanf f f 三 函數(shù)參數(shù)及其傳遞方式形參與實參形式參數(shù) 定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù) 調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式 例比較兩個數(shù)并輸出大者 main inta b c scanf d d 說明1 實參必須有確定的值形參必須指定類型形參與實參類型一致 個數(shù)相同若形參與實參類型不一致 自動按形參類型轉(zhuǎn)換 函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存 函數(shù)調(diào)用時為形參分配內(nèi)存 調(diào)用結(jié)束 內(nèi)存釋放 形參與實參形式參數(shù) 定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù) 調(diào)用函數(shù)時函數(shù)名后面括號中的表達(dá)式 說明2 1 形參只有在函數(shù)調(diào)用時才分配存儲單元 調(diào)用結(jié)束后 釋放所分配的單元 2 實參可以是常量 變量 表達(dá)式 總之要有確定的值 當(dāng)函數(shù)調(diào)用時 將實參的值傳遞給形參 若是數(shù)組名 則傳送的是數(shù)組的首地址 3 被調(diào)函數(shù)中 形參類型必須指定 以便分配存儲單元 4 實參 形參的數(shù)據(jù)類型一致 賦值要兼容 順序要一致 5 若被調(diào)函數(shù)類型為非整形 要在主調(diào)函數(shù)中對被調(diào)函數(shù)作原形聲明或在主調(diào)函數(shù)之前定義 6 實參對形參的數(shù)據(jù)傳送是值傳送 也是單向傳送 當(dāng)被調(diào)函數(shù)的形參發(fā)生變化時 并不改變主調(diào)函數(shù)實參的值 例計算x的立方 includefloatcube floatx return x x x main floata product printf Pleaseinputvalueofa scanf f x 1 2 1 2 1 728 1 參數(shù)傳遞方式值傳遞方式方式 函數(shù)調(diào)用時 為形參分配單元 并將實參的值復(fù)制到形參中 調(diào)用結(jié)束 形參單元被釋放 實參單元仍保留并維持原值特點 形參與實參占用不同的內(nèi)存單元單向傳遞 例交換兩個數(shù) ch7 2 c includemain intx 7 y 11 printf x d ty d n x y printf s n s printf x d ty d n x y swap inta intb inttemp temp a a b b temp 函數(shù)說明對被調(diào)用函數(shù)要求 必須是已存在的函數(shù)庫函數(shù) include用戶自定義函數(shù) 函數(shù)類型說明函數(shù)說明一般形式 函數(shù)類型函數(shù)名 形參類型 形參名 或函數(shù)類型函數(shù)名 作用 告訴編譯系統(tǒng)函數(shù)類型 參數(shù)個數(shù)及類型 以便檢驗函數(shù)定義與函數(shù)說明不同函數(shù)說明位置 程序的數(shù)據(jù)說明部分 函數(shù)內(nèi)或外 下列情況下 可不作函數(shù)說明若函數(shù)返值是char或int型 系統(tǒng)自動按int型處理被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前有些系統(tǒng) 如BorlandC 要求函數(shù)說明指出函數(shù)返值類型和形參類型 并且對void和int型函數(shù)也要進行函數(shù)說明 例函數(shù)說明舉例 二 地址傳遞方式 函數(shù)調(diào)用時 將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參特點 形參與實參占用同樣的存儲單元 雙向 傳遞實參和形參必須是地址常量或變量方法有兩種指針作函數(shù)的參數(shù)數(shù)組作函數(shù)的參數(shù) 1 指針作函數(shù)的參數(shù) 1 用指針 地址 作函數(shù)參數(shù) 可以實現(xiàn) 通過被調(diào)用的函數(shù)改變主調(diào)函數(shù)中變量的值 的目的 2 使用指針作為函數(shù)參數(shù)可以在調(diào)用一個函數(shù)時得到多個由被調(diào)函數(shù)改變了的值 ch9 3 c s p1 int p2 intp p p1 p1 p2 p2 p main inta b scanf d d 例交換兩個數(shù) 例如 有一數(shù)組有10個元素 要求輸出其中最大和最小的元素值 defineN10main voidmax min intarr int pt1 int pt2 intn intarray N 1 8 10 2 5 0 7 15 4 5 p1 p2 a b p1 函數(shù)的嵌套與遞歸調(diào)用 加 嵌套調(diào)用C規(guī)定 函數(shù)定義不可嵌套 但可以嵌套調(diào)用函數(shù) 例求三個數(shù)中最大數(shù)和最小數(shù)的差值 includeintdif intx inty intz intmax intx inty intz intmin intx inty intz voidmain inta b c d scanf d d d Ch7 202 c intdif intx inty intz returnmax x y z min x y z intmax intx inty intz intr r x y x y return r z r z intmin intx inty intz intr r x y x y return r z r z 例用弦截法求方程根 運行情況 Inputx1 x2 2 6 Arootofequationis5 0000 遞歸調(diào)用定義 函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用 說明C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制每調(diào)用函數(shù)一次 在內(nèi)存堆棧區(qū)分配空間 用于存放函數(shù)變量 返回值等信息 所以遞歸次數(shù)過多 可能引起堆棧溢出 intf intx inty z z f y return 2 z 例求n的階乘 ch7 8 c includeintfac intn intf if n 0 printf n 0 dataerror elseif n 0 n 1 f 1 elsef fac n 1 n return f main intn y printf Inputaintegernumber scanf d 例1 函數(shù)f定義如下 執(zhí)行語句 m f 5 后 m的值應(yīng)為 intf intk if k 0 k 1 return1 elsereturnf k 1 f k 2 A 3B 8C 5D 13 例2 對于以下遞歸函數(shù)f 調(diào)用函數(shù)f 2 1 2 3 的輸出結(jié)果是 Voidf intn chara charb charc if n 1 printf c c a b else f n 1 a c b printf c c a b f n 1 c b a A 1 1 3 3 2 B 3 2 1 2 1 3 C 1 3 3 2 1 2 D 1 3 1 2 3 2 6 2函數(shù)參數(shù)一 數(shù)組元素作函數(shù)實參 值傳遞 例兩個數(shù)組大小比較 n 0m 0k 0 a和b為有10個元素的整型數(shù)組比較兩數(shù)組對應(yīng)元素變量n m k記錄a i b i a i b i a i k 認(rèn)為數(shù)組a b若n k 認(rèn)為數(shù)組a b若n k 認(rèn)為數(shù)組a b 數(shù)組名作函數(shù)參數(shù)地址傳遞在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組 且類型應(yīng)一致形參數(shù)組大小 多維數(shù)組第一維 可不指定形參數(shù)組名是地址變量 例求學(xué)生的平均成績 includefloataverage intstu 10 intn voidmain intscore 10 i floatav printf Input10scores n for i 0 i 10 i scanf d floataverage intstu 10 intn inti floatav total 0 for i 0 i n i total stu i av total n returnav 實參用數(shù)組名 形參用數(shù)組定義 intstu 例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較 includevoidswap2 intx inty intz z x x y y z main inta 2 1 2 swap2 a 0 a 1 printf a 0 d na 1 d n a 0 a 1 值傳遞 includevoidswap2 intx intz z x 0 x 0 x 1 x 1 z main inta 2 1 2 swap2 a printf a 0 d na 1 d n a 0 a 1 地址傳遞 例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較 例數(shù)組排序 簡單選擇排序 9 49 i 0 例數(shù)組排序 簡單選擇排序 13 68 i 1 i 8 例數(shù)組排序 簡單選擇排序 例求二維數(shù)組中最大元素值 intmax value intarray 3 4 inti j k max max array 0 0 for i 0 imax max array i j return max main inta 3 4 1 3 5 7 2 4 6 8 15 17 34 12 printf maxvalueis d n max value a 例求二維數(shù)組中各行元素之和 get sum row intx 3 intresult introw intcol inti j for i 0 i row i result i 0 for j 0 j col j result i x i j main inta 2 3 3 6 9 1 4 7 intsum row 2 row 2 col 3 i get sum row a sum row row col for i 0 i row i printf Thesumofrow d d n i 1 sum row i 18 12 幾點說明 1 數(shù)組名作形 實參數(shù)時 應(yīng)分別在主 被調(diào)函數(shù)中對其聲明2 形 實參數(shù)的數(shù)組類型要一致 大小一般相等 以保證數(shù)據(jù)的全部傳送 3 當(dāng)形參數(shù)組大小未指定時 用一實參將數(shù)組長度傳遞給形參以便對數(shù)組進行操作 4 數(shù)組名作參數(shù)時 傳遞的是地址 對形參數(shù)組的操作實際上也是對實參數(shù)組的操作 6 2 2字符串指針作函數(shù)參數(shù) 將一個字符串從一個函數(shù)傳遞到另一個函數(shù) 可以采用地址傳遞的辦法 即將字符數(shù)組名作參數(shù)或用指向字符串的指針變量作參數(shù) 在被調(diào)用的函數(shù)中可以改變字符串的內(nèi)容 在主調(diào)函數(shù)中可以得到改變了的字符串 voidcopy string from to charfrom to inti 0 while from i 0 to i from i i to i 0 main chara Iamateacher charb youareastudent printf string a s nstring b s n a b copy string a b printf nstring a s nstring b s n a b 1 形參和實參都用用字符數(shù)組作參數(shù) 程序 voidcopy string from to char from to for from 0 from to to from to 0 main chara Iamateacher charb youareastudent printf string a s nstring b s n a b copy string a b printf nstring a s nstring b s n a b 2 形參用字符指針變量 實參用數(shù)組名 另外形參和實參都用字符指針 以及形參用字符數(shù)組名 實參用字符指針在10 3 2中已經(jīng)講過 不再重復(fù) 3 copy string函數(shù)的簡化 6 3函數(shù)指針 一個函數(shù)包括一組指令序列 存儲在某一段內(nèi)存中 這段內(nèi)存空間的起始地址稱為函數(shù)的入口地址稱函數(shù)入口地址為函數(shù)的指針 函數(shù)名代表函數(shù)的入口地址可以定義一個指針變量 其值等于該函數(shù)的入口地址 指向這個函數(shù) 這樣通過這個指針變量也能調(diào)用這個函數(shù) 這種指針變量稱為指向函數(shù)的指針變量 定義指向函數(shù)的指針變量的一般形式為 類型標(biāo)識符 指針變量名 例 int p 指針變量p可以指向一個整型函數(shù) float q 指針變量q可以指向一個浮點型函數(shù) 下一頁 上一頁 剛定義的指向函數(shù)的指針變量 亦象其它指針變量一樣要賦以地址值才能引用 當(dāng)將某個函數(shù)的入口地址賦給指向函數(shù)的指針變量 就可用該指針變量來調(diào)用所指向的函數(shù)給函數(shù)指針賦初值 將函數(shù)名 函數(shù)的入口地址值 賦給指針變量例如intm p intmax inta intb 則可以p max p指向函數(shù)max 指針調(diào)用函數(shù)的一般形式為 指針變量 實參表 如上例 m p 12 22 比較m max 12 22 下一頁 上一頁 用函數(shù)指針調(diào)用函數(shù)是間接調(diào)用 沒有參數(shù)類型說明 C編譯系統(tǒng)也無法進行類型檢查 因此 在使用這種形式調(diào)用函數(shù)時要特別小心 實參一定要和指針?biāo)负瘮?shù)的形參類型一致 函數(shù)指針可以作為函數(shù)參數(shù) 此時 當(dāng)函數(shù)指針每次指向不同的函數(shù)時 可執(zhí)行不同的函數(shù)來完成不同的功能 下一頁 上一頁 注意 例函數(shù)max 用來求一維數(shù)組的元素的最大值 在主調(diào)函數(shù)中用函數(shù)名調(diào)用該函數(shù)與用函數(shù)指針調(diào)用該函數(shù)來實現(xiàn) 下一頁 上一頁 include stdio h defineM8main floatsumf sump floata M 11 2 3 4 5 5 69 7 80 float p 定義指向函數(shù)的指針p floatmax floata intn 函數(shù)聲明 p max 函數(shù)名 函數(shù)入口地址 賦給指針p sump p a M 用指針方式調(diào)用函數(shù) sumf max a M 用函數(shù)名調(diào)用max 函數(shù) printf sump 2f n sump printf sumf 2f n sumf floatmax floata intn intk floats s a 0 for k 0 k n k if s a k s a k returns 下一頁 上一頁 程序運行結(jié)果 sump 80 00sumf 80 00 1 定義一個指向函數(shù)的指針變量 形如 float p 2 為函數(shù)指針賦值 格式如下 p 函數(shù)名 注意 賦值時只需給出函數(shù)名 不要帶參數(shù) 3 通過函數(shù)指針調(diào)用函數(shù) 調(diào)用格式如下 s p 實參 上一頁 指向函數(shù)的指針的使用步驟 返回 函數(shù)指針的作用 用函數(shù)指針變量作函數(shù)的參數(shù)函數(shù)的參數(shù)既可以是變量 常量 指針變量 數(shù)組名 數(shù)組指針變量 也可以是函數(shù)指針或函數(shù)指針變量 以便實現(xiàn)函數(shù)地址的傳送 達(dá)到用某個函數(shù)調(diào)用其他的函數(shù) 函數(shù)的調(diào)用方式 1 直接使用函數(shù)名2 間接調(diào)用 通過函數(shù)指針 0 Y X h f b f a n h b a f a 共n等份 f x h b a n f a h f a n 1 h s 1 x2 floatf1 x floatx floatf f 1 x x return f floatf3 x floatx floatf f x 1 x x return f 1 x x2 x3 floatf2 x floatx floatf f 1 x x x x x x return f 多層間接調(diào)用 即用函數(shù)指針變量作函數(shù)的參數(shù) 在調(diào)用一個通用函數(shù)時 便于處理多種情況 以便選用各種專用的函數(shù) 這樣做的好處是使得程序通用性強 結(jié)構(gòu)模塊化程度高 例 求不同被積函數(shù)的積分 1 x2 floatintegral fun a b float fun a b floats h y intn i s fun a fun b 2 0 n 100 h b a n for i 1 i n i s s fun a i h y s h return y 梯形法求解定積分 main floatf1 f2 f3 integral floaty1 y2 y3 y1 integral f1 0 0 1 0 y2 integral f2 0 0 2 0 y3 integral f3 0 0 3 5 printf y1 6 2f ny2 6 2f ny3 6 2f n y1 y2 y3 S h f a f b 2 f a h f a 2h f a n 1 h 由上述例子可以看出 首先函數(shù)integral fun a b 是用梯形法求積分的通用函數(shù) 它適用于各種被積函數(shù) f1 f2 f3為三個不同的被積函數(shù) 如果要用integral函數(shù)求解其它的被積函數(shù)的定積分 則只要添加相應(yīng)的被積函數(shù)的構(gòu)造函數(shù) 而無須改寫或重新編寫integral函數(shù) 在主調(diào)函數(shù)中直接調(diào)用integral函數(shù) 當(dāng)然要提供相應(yīng)的參數(shù) 即可 如果把被積函數(shù)的構(gòu)造和求積分的函數(shù)寫在一起 那就不具備通用性了 注意 main 函數(shù)中的floatf1 f2 f3 integral 語句不能省略 這一句告訴系統(tǒng)f1 f2 f3是函數(shù) 而不是變量 6 4指針型函數(shù) 返回指針的函數(shù) 下一頁 上一頁 指針函數(shù) 是指返回值為指針的函數(shù)指針函數(shù)的定義形式 類型標(biāo)示符 函數(shù)名 參數(shù) 例如 int fun inta intb 函數(shù)體語句 在函數(shù)體中有返回指針或地址的語句 形如 return 并且返回值的類型要與函數(shù)類型一致 例分析如下程序 main inta b p int max intx inty scanf d d int max intx inty ifx y return 下一頁 上一頁 6 5命令行參數(shù) 在操作系統(tǒng)命令狀態(tài)下 可以輸入程序或命令使其運行 稱命令行狀態(tài) 輸入的命令 或運行程序 及該命令 或程序 所需的參數(shù)稱為命令行參數(shù) 如 copyfdfscopy是文件拷貝命令 fd fs是命令行參數(shù) main函數(shù)是可以有參數(shù)的 但與普通函數(shù)不同 帶形參的main 函數(shù)的一般形式是 main intargc char argv 形參argc記錄命令行中字符串的個數(shù) argv是一個字符型指針數(shù)組 每一個元素順序指向命令行中的一個字符串 下一頁 上一頁 1 main 函數(shù)的形參與實參 main 函數(shù)由系統(tǒng)自動調(diào)用 而不是被程序內(nèi)部的其它函數(shù)調(diào)用 main 函數(shù)所需的實參不可能由程序內(nèi)部得到 而是由系統(tǒng)傳送 main 函數(shù)所需的實參與形參的傳遞方式也與一般函數(shù)的參數(shù)傳遞不同 實參是在命令行與程序名一同輸入 程序名和各實際參數(shù)之間都用空格分隔 格式為 執(zhí)行程序名參數(shù)1參數(shù)2 參數(shù)n形參argc為命令行中參數(shù)的個數(shù) 包括執(zhí)行程序名 其值大于或等于1 而不是象普通C語言函數(shù)一樣接受第一個實參 形參argv是一個指針數(shù)組 其元素依次指向命令行中以空格分開的各字符串 即 第一個指針argv 0 指向程序名字符串 argv 1 指向參數(shù)1 argv 2 指向參數(shù)2 argv n 指向參數(shù)n 下一頁 上一頁 2 命令行參數(shù)的傳遞示例例8 11分析下列程序 指出其執(zhí)行結(jié)果 該程序命名為exam c 經(jīng)編譯連接后生成的可執(zhí)行程序為exam exe includemain intargc char argv inti 0 printf argc d n argc while argc 1 printf n參數(shù) d s i argv i argc argv 下一頁 上一頁 輸出結(jié)果 argc 4參數(shù)0 exam參數(shù)1 Turbo c參數(shù)2 C 參數(shù)3 Vc程序開始運行后 系統(tǒng)將命令行中字符串個數(shù)送argc 將四個字符串實參 exam Turbo c C Vc的首地址分別傳給字符指針數(shù)組元素argv 0 argv 1 argv 2 argv 3 若運行該程序時的命令行輸入的是 examTurbo cC Vc 上一頁 返回 6 6變量的存儲屬性概述變量是對程序中數(shù)據(jù)的存儲空間的抽象 編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元 10 程序中使用變量名對內(nèi)存操作 變量的屬性數(shù)據(jù)類型 變量所持有的數(shù)據(jù)的性質(zhì) 操作屬性 存儲屬性存儲器類型 寄存器 靜態(tài)存儲區(qū) 動態(tài)存儲區(qū)生存期 變量在某一時刻存在 靜態(tài)變量與動態(tài)變量作用域 變量在某區(qū)域內(nèi)有效 局部變量與全局變量變量的存儲類型auto 自動型register 寄存器型static 靜態(tài)型extern 外部型變量定義格式 存儲類型 數(shù)據(jù)類型變量表 概述變量是對程序中數(shù)據(jù)的存儲空間的抽象 如 intsum autointa b c registerinti staticfloatx y 局部變量與全局變量局部變量 內(nèi)部變量定義 在函數(shù)內(nèi)定義 只在本函數(shù)內(nèi)有效說明 main中定義的變量只在main中有效不同函數(shù)中同名變量 占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量局部變量可用存儲類型 autoregisterstatic 默認(rèn)為auto 全局變量 外部變量定義 在函數(shù)外定義 可為本文件所有函數(shù)共用有效范圍 從定義變量的位置開始到本源文件結(jié)束 及有extern說明的其它源文件 應(yīng)盡量少使用全局變量 因為 全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性 可靠性 可移植性降低程序清晰性 容易出錯 定義說明次數(shù) 只能1次可說明多次位置 所有函數(shù)之外函數(shù)內(nèi)或函數(shù)外分配內(nèi)存 分配內(nèi)存 可初始化不分配內(nèi)存 不可初始化 外部變量說明 extern數(shù)據(jù)類型變量表 外部變量定義與外部變量說明不同 若外部變量與局部變量同名 則外部變量被屏蔽 外部變量可用存儲類型 缺省或static floatmax min floataverage floatarray intn inti floatsum array 0 max min array 0 for i 1 imax max array i elseif array i min min array i sum array i return sum n main inti floatave score 10 Input ave average score 10 printf max 6 2f nmin 6 2f naverage 6 2f n max min ave externcharc1 c2 externcharc1 c2 運行結(jié)果 max 13 externinta b intmax intz z a b a b return z main printf max d max inta 13 b 8 運行結(jié)果 max 8 inti main voidprt for i 0 i 5 i prt voidprt for i 0 i 5 i printf c printf n 例外部變量副作用 運行結(jié)果 動態(tài)變量與靜態(tài)變量存儲方式靜態(tài)存儲 程序運行期間分配固定存儲空間動態(tài)存儲 程序運行期間根據(jù)需要動態(tài)分配存儲空間內(nèi)存用戶區(qū) 生存期靜態(tài)變量 從程序開始執(zhí)行到程序結(jié)束動態(tài)變量 從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束 1 auto變量函數(shù)內(nèi)部無static聲明的局部量均為動態(tài)存儲類別 被分配在動態(tài)區(qū) 存儲類別為自動時 聲明符auto可省 自動變量被分配在動態(tài)區(qū) 未賦初值時 其值未定義 每次調(diào)用重新賦值 intf inta autointb c 3 定義b c為自動變量 又如 autointb c 3 intb c 3 兩者等價 2 用static聲明局部變量若希望函數(shù)調(diào)用結(jié)束后 其值不消失 下次調(diào)用函數(shù)時繼續(xù)使用 則用static對變量加以聲明 例考察靜態(tài)局部變量的值f inta autointb 0 staticintc 3 b b 1 c c 1 return a b c main inta 2 i for i 0 i 3 i printf d f a 運行結(jié)果 789 靜態(tài)局部變量的聲明 1 分配在靜態(tài)區(qū) 程序運行結(jié)束釋放存儲單元 2 僅開始時賦初值一次 未賦初值時為0 以后每次調(diào)用函數(shù)時 變量不再賦值 前次操作的結(jié)果被保留 3 局部動態(tài)變量若未賦初值 其值是不確定的 所分配的存儲單元是不固定的 而局部靜態(tài)變量未賦初值 其值為0 字符型變量的值為 0 所分配的存儲單元是固定的 4 靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后雖存在 但其它函數(shù)不能引用它 使用局部靜態(tài)變量有如下幾種情況 1 需要保留上一次調(diào)用結(jié)束時的值 2 初始化后變量只被引用而不改變其值 則用靜態(tài)局部變量較方便 缺點 從程序運行開始到結(jié)束一直占用內(nèi)存 這樣會浪費系統(tǒng)資源 例打印1 5的階乘值intfac intn staticintf 1 f f n return f main inti for i 1 i 5 i printf d d n i fac i 問題 1 將static改為auto2 其它函數(shù)能否使用局部靜態(tài)變量 f inta autointb 0 staticintc 3 b b 1 c c 1 printf f main 026ff 01famain a ffd8 a 2main i ffda i 252f a ffd6 a 2f b ffd0 b 1f c 0194 c 47f a ffd6 a 2f b ffd0 b 1f c 0194 c 58f a ffd6 a 2f b ffd0 b 1f c 0194 c 69 3 register變量CPU內(nèi)部有寄存器組可用來存放數(shù)據(jù) 若把數(shù)據(jù)聲明為寄存器類型 則將該類型的數(shù)據(jù)存放在寄存器中 其優(yōu)點在于 減少數(shù)據(jù)與內(nèi)存之間的交換頻率 提高程序的效率和速度 例使用寄存器變量intfac intn registerinti f 1 for i 1 i n i f f i return f main inti for i 1 i 5 i printf d d n i fac i 運行結(jié)果 1 12 23 64 245 120 4 用extern聲明外部變量外部變量也稱全局變量 在函數(shù)外部定義 其作用域是從變量的定義處開始 到本程序文件的未尾 5 用static聲明外部變量若使全局變量只限于定義它的文件中的函數(shù)引用 而不讓其它文件中的函數(shù)引用 需要用static加以說明 注意 此種說法只在工程方法中有效 而在文件包含中則不起作用 關(guān)于作用域和生成期的概念用圖例說明變量的作用域和生成期的關(guān)系 關(guān)于作用域和生成期的概念用圖例說明變量的作用域和生成期的關(guān)系 變量存儲類型小結(jié) 局部變量默認(rèn)為auto型register型變量個數(shù)受限 且不能為long double float型局部static變量具有全局壽命和局部可見性局部static變量

溫馨提示

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

評論

0/150

提交評論