C語言程序設(shè)計(譚浩強編)第八章 函數(shù)6學時new.ppt_第1頁
C語言程序設(shè)計(譚浩強編)第八章 函數(shù)6學時new.ppt_第2頁
C語言程序設(shè)計(譚浩強編)第八章 函數(shù)6學時new.ppt_第3頁
C語言程序設(shè)計(譚浩強編)第八章 函數(shù)6學時new.ppt_第4頁
C語言程序設(shè)計(譚浩強編)第八章 函數(shù)6學時new.ppt_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章函數(shù) 8 1概述函數(shù) 英文名為Function 直譯為 功能 函數(shù) 的意思在C語言里 函數(shù)指的是實現(xiàn)一個特定功能的程序模塊 它相當于其他語言中的子程序 一個C語言程序可由一個主函數(shù)和若干個函數(shù)構(gòu)成 其中主函數(shù)是不可缺省的 每個C程序由主函數(shù)調(diào)用其他函數(shù) 其他函數(shù)也可以相互調(diào)用 在程序設(shè)計中 常將一些常用的功能模塊編寫成函數(shù) 放在函數(shù)庫中供公共選用 main fa fb fa f1 f1 f3 fb f2 f3 f2 執(zhí)行過程 結(jié)構(gòu)框圖 結(jié)構(gòu)框圖 框圖 main printstar print message printstar printstar printstar函數(shù) printf n print message print message函數(shù) printf Howdoyoudo n 函數(shù)調(diào)用的例子 運行情況為 Howdoyoudo main 調(diào)用函數(shù)1 調(diào)用函數(shù)2 調(diào)用其它函數(shù) 函數(shù)1 函數(shù)2 C程序的一般通用結(jié)構(gòu) 其它函數(shù) 說明 1 一個C源程序文件由一個或多個函數(shù)組成 以源程序文件為編譯單位 2 main 函數(shù)由系統(tǒng)定義 3 函數(shù)定義 可以互相調(diào)用 在其它函數(shù)中不能調(diào)用main 函數(shù) 4 函數(shù)的種類從用戶來看 標準函數(shù) 庫函數(shù) 用戶自定義函數(shù) 從形式來看 無參函數(shù) 有參函數(shù) 不能嵌套 函數(shù)定義嚴禁嵌套main printstar printstar printf n 因大括號位置不當引起函數(shù)定義上的嵌套 XX 重點 8 2函數(shù)定義的一般形式一般格式 存儲類型數(shù)據(jù)類型函數(shù)名 形式參數(shù)表列 聲明部分執(zhí)行語句 現(xiàn)代定義形式 傳統(tǒng)定義形式 說明 1 數(shù)據(jù)類型指的是函數(shù)的返回值類型 2 可以定義和使用空函數(shù) 空函數(shù)定義和使用 intmax intx inty intz z x y x y return z 說明 intmax x y intx y intz z x y x y return z 說明 空函數(shù)的應用應用 模塊設(shè)計過程中 intdummy 說明 不能嵌套 函數(shù)定義嚴禁嵌套main printstar printstar printf n 因大括號位置不當引起函數(shù)定義上的嵌套 XX 重點 8 3函數(shù)參數(shù)和函數(shù)的值 8 3 1形式參數(shù)和實際參數(shù)在定義函數(shù)時函數(shù)名后面括弧中的變量名稱為 形式參數(shù) 簡稱 形參 在主調(diào)函數(shù)中調(diào)用函數(shù)時 函數(shù)名后面括弧中的參數(shù) 可以是一個表達式 稱為 實際參數(shù) 簡稱 實參 例8 2調(diào)用函數(shù)時的數(shù)據(jù)傳遞main inta b c scanf d d 運行情況如下 7 8Maxis8 實參a b 形參x y 函數(shù)參數(shù)傳遞演示 main inta b s a 2 b 3 s sum a b 其它處理 printf s d s intsum x y intx y ints 其它處理 s x y return s a 2 b 3 s 5 關(guān)于形參與實參的說明 1 形參變量在未出現(xiàn)函數(shù)調(diào)用時 并不占用內(nèi)存單元 調(diào)用時才為其分配內(nèi)存單元 且調(diào)用結(jié)束后所占用內(nèi)存單元立即釋放 2 實參可以是常量 變量 包括指針變量 數(shù)組名 包括數(shù)組元素 或表達式等 但應有確定的值 如 max 3 a b 3 實參和形參在數(shù)據(jù)類型和個數(shù)上應匹配 4 實參對形參的數(shù)據(jù)傳遞是 值傳遞 即單向傳遞 二者在內(nèi)存中占據(jù)不同的內(nèi)存單元 在調(diào)用函數(shù)時 形參的值即使發(fā)生變化 也不會改變主調(diào)函數(shù)的實參值 實例 形參的值改變不會改變實參的值main inta 3 b 4 add a b printf d d n a b add intx inty x x 3 y y 4 結(jié)果為 3 4 重點 5 形參變量和實參變量可以同名 main inta 3 b 4 add a b printf d d n a b add inta intb a a 3 b b 4 3 4 3 4 6 8 a b a b a b 輸出 3 4 變量或表達式 4 若確定不需要帶回返回值 則可以將函數(shù)定義為 void型 系統(tǒng)保證不使用函數(shù)的返回值 二 函數(shù)的返回值格式 return 說明 1 一個函數(shù)中允許有多個return語句 2 函數(shù)值的類型應和return語句中變量 或表達式 的類型一致 如不匹配 則以函數(shù)類型為準 對于數(shù)值型數(shù)據(jù)可以自動進行類型轉(zhuǎn)換 3 若被調(diào)函數(shù)中無return語句 則返回一個不確定值 一個函數(shù)中允許有多個return語句intmax intx inty if x y return x elsereturn y 多個return 示例 函數(shù)返回值隱含的自動類型轉(zhuǎn)換main floata b c scanf f f 類型轉(zhuǎn)換 示例 程序運行 程序運行輸入 1 5 2 5 輸出 maxis2 重點 無return語句則返回一個不確定值main inta b a printstar a b不確定 b print message printf d d n a b printstar printf n printstar printf Helloworld n 返回不確定值 示例 請找出有錯的語句 main inta b a printstar b print message printf d d n a b voidprintstar printf n voidprint message printf Helloworld n 請找錯 示例 return返回變量或表達式的值intmax intx inty intz z x y x y return z 返回變量的值 intmin intx inty return x y x y 返回表達式的值 說明 8 4函數(shù)的調(diào)用一 一般形式格式 函數(shù)名 實參表列 說明 1 對無參函數(shù) 括號不能省 2 若有多個實參 則各參數(shù)之間應有逗號 3 實參和形參在個數(shù)和類型上要匹配 4 對實參表列的求值順序不確定 可從左至右 也可從右至左 視系統(tǒng)而定 如TurboC中就是按從右至左 實例 main inti 2 intp p f i i printf d p intf inta intb intc if a b c 1 elseif a b c 0 elsec 1 return c 結(jié)果說明 結(jié)果 可能是 1也可能是0 因為 按從左至右求值 則為f 2 3 即 a b p為 1按從右至左求值 則為f 3 3 即 a b p為0若本意按從左至右 則可改為 j i k i p f j k 補充例 include stdio h main charc1 c2 c3 c1 getchar c2 getchar c3 getchar printf c c c n putchar c1 putchar c2 putchar c3 輸入 abc 輸出 cbaabc printf c c c n a b c 二 函數(shù)的調(diào)用方式1 函數(shù)語句作為一條獨立的語句完成一定的操作 如例7 1中 printstar 2 函數(shù)表達式出現(xiàn)在表達式中 參與運算 如 c 2 max a b 3 函數(shù)參數(shù)如 m max a max b c printf d max a b 例1 在下列幾種情況下可以不必作函數(shù)聲明 三種形式 例3 三 對被調(diào)函數(shù)的聲明 說明 1 被調(diào)函數(shù)必須存在 2 使用庫函數(shù)時應在文件開頭用 include命令將調(diào)用有關(guān)庫函數(shù)時所需用到的信息包含到源程序中來 3 對用戶自定義函數(shù) 一般情況下應在主調(diào)函數(shù)中對被調(diào)函數(shù)作聲明 說明 即函數(shù)原型 作用 在編譯階段對調(diào)用函數(shù)的合法性進行檢查 對被調(diào)函數(shù)聲明有 函數(shù)聲明形式 函數(shù)類型函數(shù)名 函數(shù)類型函數(shù)名 參數(shù)類型1 參數(shù)類型2 函數(shù)類型函數(shù)名 參數(shù)類型1 參數(shù)名1 參數(shù)類型2參數(shù)名2 說明 對被調(diào)函數(shù)聲明形式1main floatadd 函數(shù)聲明形式1 floata b c scanf f f 說明 例2 對被調(diào)函數(shù)聲明形式2main floatadd float float 函數(shù)聲明形式 floata b c scanf f f 說明 對被調(diào)函數(shù)聲明形式3main floatadd floata floatb 聲明形式3 floata b c scanf f f 說明 可以不必作函數(shù)聲明的幾種情況1 函數(shù)類型是int和char型 2 被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)前 3 在整個文件開頭 在函數(shù)外部集中做了函數(shù)聲明 如 charletter floatf intj main 不必聲明它所調(diào)用的函數(shù) 說明 8 5函數(shù)的嵌套調(diào)用 C語言的函數(shù)定義都是互相平行 獨立的 也就是說在定義函數(shù)時 一個函數(shù)內(nèi)不能包含另一個函數(shù) 這是和PASCAL不同的 C語句不能嵌套定義函數(shù) 但可以嵌套調(diào)用函數(shù) 也就是說 在調(diào)用一個函數(shù)的過程中 又調(diào)用另一個函數(shù) 下圖表示的是兩層嵌套 連main函數(shù)共3層函數(shù) 其執(zhí)行過程見圖 main函數(shù) 調(diào)用a函數(shù) 結(jié)束 a函數(shù) 調(diào)用b函數(shù) b函數(shù) 8 6函數(shù)的遞歸調(diào)用 在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身 稱為函數(shù)的遞歸調(diào)用 C語言的特點之一就在于允許函數(shù)的遞歸調(diào)用 例如 intf intx inty z z f y return 2 z 在調(diào)用函數(shù)f的過程中 又要調(diào)用f函數(shù) 這是直接調(diào)用本函數(shù) 見圖 f函數(shù) 調(diào)用f函數(shù) 在調(diào)用f1函數(shù)過程中要調(diào)用f2函數(shù) 而在調(diào)用f2函數(shù)過程中又要調(diào)用f1函數(shù) 從圖上可以看到 這兩種遞歸調(diào)用都是無終止的自身調(diào)用 顯然 程序中不應出現(xiàn)這種無終止的遞歸調(diào)用 而只應出現(xiàn)有限次數(shù)的 有終止的遞歸調(diào)用 這可以用if語句來控制 只有在某一條件成立時才繼續(xù)執(zhí)行遞歸調(diào)用 否則就不再繼續(xù) f1函數(shù) 調(diào)用f2函數(shù) f2函數(shù) 調(diào)用f1函數(shù) 例8 7有5個人坐在一起 問第5個人多少歲 他說比第4個人大2歲 問第4個人歲數(shù) 他說比第3個人大2歲 問第3個人 又說比第2個人大2歲 問第2個人 說比第1個人大2歲 最后問第1個人 他說是10歲 請問第5個人多大 顯然 這是一個遞歸問題 每一個年齡都比其前1個人的年齡大2歲 即age 5 age 4 2age 4 age 3 2age 3 age 2 2age 2 age 1 2age 1 10因此 除了第一個人 其余的人的年齡都需用遞歸法求出 遞歸函數(shù) age intn intc if n 1 c 10 elsec age n 1 2 return c 主程序 main printf d age 5 age函數(shù)n 5 main age 5 輸出age 5 c age 4 2 age函數(shù)n 4 c age 3 2 age函數(shù)n 3 c age 2 2 age函數(shù)n 2 c age 1 2 age函數(shù)n 1 c 10 age 2 12 age 3 14 age 4 16 age 5 18 執(zhí)行過程如下 例8 8用遞歸的方法求n 遞推法 從1開始 乘2 乘3 一直乘到n 其基本原理是從一個已知事實推出下一個事實 遞歸法 當n 1或0時 n 1 當n 1時 n n n 1 floatfac intn floatf if n 0 printf n 0 dataerror elseif n 0 n 1 f 1 elsef fac n 1 n return f main intn floaty printf inputaintegernumber scanf d 實例1 實例2large 實例2main 8 7數(shù)組作為函數(shù)參數(shù)C語言中 函數(shù)參數(shù)可以是常量 變量 包括指針變量 數(shù)組名 數(shù)組元素 表達式等 數(shù)組元素可以作實參 數(shù)組名可以作實參和形參 一 數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參與變量作實參一樣 仍按 值傳遞 數(shù)組元素作函數(shù)實參intsum intx inty return x y main inta 2 2 3 s s sum a 0 a 1 printf sum d s 示例 數(shù)組元素作函數(shù)實參 main函數(shù) main inta 10 b 10 i n 0 m 0 k 0 for i 0 i 10 i scanf d 示例 數(shù)組元素作函數(shù)實參large intx inty intflag if x y flag 1 elseif x y flag 1 elseflag 0 return flag 示例 main intlarge intx inty inta 10 b 10 i n 0 m 0 k 0 printf enterarraya n for i 0 ib i dimes na i b i dimes na i k printf arrayaislargerthanarrayb n if n k printf arrayaissmallerthanarrayb n elseprintf arrayaisequaltoarrayb n large intx inty intflag if x y flag 1 elseif x y flag 1 elseflag 0 return flag 二 數(shù)組名作函數(shù)參數(shù)數(shù)組名代表數(shù)組的首地址 它可以作實參和形參 傳遞數(shù)組的首地址 使實參數(shù)組和形參數(shù)組共用同一段內(nèi)存單元 其效果是傳遞整個實參數(shù)組 要求 實參和形參都應為數(shù)組名 如 inta 10 2 4 6 8 9 7 3 22 5 1 intb 10 24689732251 實參數(shù)組a 形參數(shù)組b 數(shù)組名可作函數(shù)參數(shù) 此時實參與形參都應用數(shù)組名 例8 11有一個一維數(shù)組score 內(nèi)放10個學生成績 求平均成績 main floatscore 10 aver inti printf input10score n for i 0 i 10 i scanf f floataverage floatarray 10 inti floataver sum array 0 for i 1 i 10 i sum sum array i aver sum 10 return aver 說明 1 數(shù)組名作函數(shù)參數(shù)其實質(zhì)是 地址傳遞 若形參數(shù)組中各元素的值發(fā)生變化 將使實參數(shù)組各元素的值也隨之而變化 2 用數(shù)組名作函數(shù)參數(shù) 應在主調(diào)函數(shù)與被調(diào)函數(shù)中分別定義數(shù)組 且二者的類型應匹配 傳遞數(shù)組元素個數(shù) 另設(shè)一參數(shù)來接收實參數(shù)組元素的個數(shù) 被調(diào)函數(shù)示例 主調(diào)函數(shù)示例 實例 3 形參數(shù)組也可以不指定大小 常在被調(diào)函數(shù)中 主調(diào)函數(shù) 數(shù)組作函數(shù)形參floataverage floatarray 10 inti floataver sum array 0 for i 1 i 10 i sum sum array i aver sum 10 return aver 實例 數(shù)組名作函數(shù)實參main floatscore 10 aver inti printf input10scores n for i 0 i 10 i scanf f 實例 數(shù)組作函數(shù)形式參數(shù)另設(shè)一參數(shù)來接收數(shù)組元素的個數(shù)floataverage floatarray intn inti floataver floatsum array 0 for i 1 i n i sum sum array i aver sum n return aver 示例 數(shù)組名作函數(shù)實際參數(shù)并傳遞數(shù)組元素的個數(shù)main floatscore 1 5 98 5 97 91 5 60 55 floatscore 2 10 67 5 89 5 99 69 5 77 89 5 76 5 54 60 99 5 printf theaverageofAis 6 2f n average score 1 5 printf theaverageofBis 6 2f n average score 2 10 示例 數(shù)組名函數(shù)實參main inti a 5 1 2 3 4 5 add a for i 0 i 5 i printf d a i add intb 5 b 0 2 b 1 2 b 2 2 b 3 2 b 4 2 示例 2 放入a 0 中 a 0 min 有5個數(shù) 請找到最小數(shù)放入第一個位置中 a 0 a 1 a 2 a 3 a 4 36194 1 先找到最小數(shù)2 放到a 0 中 1 找最小數(shù) 將遇到的第一個數(shù)假設(shè)為最小的min a 0 min和a 1 a 4 比較如果比min小 將其放入min中 繼續(xù)比較min 1 a 0 a 1 a 2 a 3 a 4 16194 1 找最小數(shù) 將遇到的第一個數(shù)假設(shè)為最小的 記錄其位置k 0 a k 和a 1 a 4 比較如果比a k 小 將該數(shù)的位置記錄下來 繼續(xù)比較k 2 2 放入a 0 中 將a 0 和最小的數(shù)交換a k 和a 0 交換 例8 13用選擇法對數(shù)組中10個整數(shù)按由小到大排序 選擇法介紹 1 將10個數(shù)進行相互比較 找出最小數(shù) 將之與a 0 對換 2 再將a 1 到a 9 的數(shù)進行比較 找出最小數(shù) 將之與a 1 對換 3 共比較9輪 最后得到排序后的結(jié)果 以5個數(shù)為例說明 a 0 a 1 a 2 a 3 a 4 36194未排序時的情況16394將5個數(shù)中最小數(shù)1與a 0 對換13694將余下的4個數(shù)中最小數(shù)3與a 1 對換13496將余下的3個數(shù)中最小數(shù)4與a 2 對換13469將余下的2個數(shù)中最小數(shù)6與a 3 對換 至此完成排序 0 假設(shè)第一個數(shù)最小 記錄位置k 0a k 和a 1 a 4 比較 找出最小數(shù)下標k 2最小數(shù)a k 和第一個數(shù)a 0 交換163941 假設(shè)第一個數(shù)最小 記錄位置k 1a k 和a 2 a 4 比較 找出最小數(shù)下標k 2最小數(shù)a k 和第一個數(shù)a 1 交換13694 a 0 a 1 a 2 a 3 a 4 36194未排序時的情況 i 假設(shè)第一個數(shù)最小 記錄位置k ia k 和a i 1 a 4 比較 找出最小數(shù)下標k最小數(shù)a k 和第一個數(shù)a i 交換 main inta 10 i printf enterthearray n for i 0 i 10 i scanf d printf thesortedarray n for i 0 i 10 i printf d a i printf n 輸入數(shù)據(jù) 輸出數(shù)據(jù) sort a 10 對數(shù)據(jù)排序 voidsort inti j k t 找出a 0 a 9 中最小元素的下標 思考題 能否對上述例題程序進行以下替換 替換 intarray intn k i for j i 1 j n j if array j array k k j t array k array k array i array i t for i 0 i n 1 i 有5個數(shù) 請找到最小數(shù)放入第一個位置中 a 0 a 1 a 2 a 3 a 4 36194 0 將遇到的第一個數(shù)假設(shè)為最小的 即a 0 為最小a 0 和a 1 a 4 比較如果比a 0 小 將其交換 繼續(xù)比較比較結(jié)束 a 0 中被放入最小的 for i 0 i n 1 i for j i 1 j n j if array j array i t array i array i array j array j t 說明 三 用多維數(shù)組作函數(shù)參數(shù)同一維數(shù)組名一樣 多維數(shù)組名也可作函數(shù)的實參和形參 其實質(zhì)仍是 地址傳遞 即將實參數(shù)組的起始地址傳給形參數(shù)組 這樣在內(nèi)存中實參數(shù)組和形參數(shù)組共占同一段內(nèi)存單元 例7 14求3 4矩陣中最大的元素 二維數(shù)組名函數(shù)實參max value intarray 4 inti j max max array 0 0 for i 0 imax max array i j return max voidmain inta 3 4 1 3 5 7 2 4 6 8 15 17 4 12 printf maxvalueis d n max value a 說明1 被調(diào)函數(shù)中的形參數(shù)組定義時可以不指定行的大小 如 intarray 3 10 intarray 10 2 實參數(shù)組可以大于形參數(shù)組 此時形參數(shù)組只接收實參數(shù)組的一部分 而其余部分不起作用 3 形參數(shù)組可以大于實參數(shù)組 此時形參數(shù)組全部接收實參數(shù)組 形參數(shù)組的多余部分無意義 一 局部變量 內(nèi)部變量 在函數(shù)內(nèi)部或復合語句內(nèi)部定義的變量 其作用域 即變量的有效區(qū)間 是從定義的位置起到函數(shù)體或復合語句結(jié)束為止 floatf inta intb c main intn m a有效 m n有效 b c有效 8 8局部變量和全局變量 說明 1 主函數(shù)中定義的變量也只在主函數(shù)中有效 主函數(shù)也不能直接使用其它函數(shù)中定義的變量 2 不同的函數(shù)中 可以使用相同名字的變量 3 形參也是局部變量 4 復合語句中定義的變量 只在復合語句中有效 如 main inta b intc c的有效范圍a b的有效范圍 二 全局變量 外部變量 在函數(shù)以外定義的變量叫全局變量 有效范圍 從定義變量的位置到本源程序文件結(jié)束 作用 全局變量可為本源程序文件中其它函數(shù)共用 intp 1 q 5 floatf1 inta intb c charc1 c2 charf2 intx inty intj k main intm n p q的有效范圍 c1 c2的有效范圍 說明 1 全局變量增加了函數(shù)之間數(shù)據(jù)的聯(lián)系 例7 15 floatmax 0 min 0 floataverage floatarray intn inti floataver sum array 0 max min array 0 for i 1 imax max array i elseif array i min min array i sum sum array i aver sum n return aver main floatave score 10 inti for i 0 i 10 i scanf f 如輸入 9945789710067 589926643 輸出 max 100 00min 43 00average 77 65 2 不必要時不使用全局變量 avescore10maxmin averarraynmaxmin maxmin全局變量 main函數(shù) average函數(shù) 3 在定義點之前的函數(shù)要引用外部變量時 則應在該函數(shù)中用關(guān)鍵字extern作說明 例8 16intmax intx inty intz z x y x y return z main externa b printf d max a b inta 12 b 8 注意 外部變量的定義與外部變量的說明的區(qū)別 4 在同一個源文件中 如外部變量和局部變量同名 則在局部變量的作用域內(nèi) 外部變量不起作用 inta 3 b 5 max inta intb intc c a b a b return c main inta 8 printf d max a b 結(jié)果 8 a b為局部變量 外部變量定義 局部變量 全局變量 8 9動態(tài)存儲變量與靜態(tài)存儲變量一 變量的存儲類型全局變量 外部變量 變量存儲類型 反映的是數(shù)據(jù)在內(nèi)存中存儲的區(qū)域 全局變量位置 靜態(tài)存儲區(qū) 特點 在程序開始執(zhí)行時給全局變量分配一定的存儲單元 至到程序執(zhí)行完畢才釋放 局部變量位置 一般存放在動態(tài)存儲區(qū) 特點 函數(shù)調(diào)用開始時 分配動態(tài)存儲空間 函數(shù)結(jié)束時 釋放空間 即分配和釋放都是動態(tài)的 作用范圍 值存在的時間 靜態(tài)存儲區(qū) 動態(tài)存儲區(qū) 用戶程序區(qū) 用戶區(qū) 局部變量 內(nèi)部變量 靜態(tài)存儲變量 動態(tài)存儲變量 變量的兩種屬性 兩種屬性C語言中 每一個變量和函數(shù)都具有兩種屬性 即 數(shù)據(jù)類型和存儲類型 存儲類型數(shù)據(jù)類型變量名 存儲類型具體有 自動型 auto 靜態(tài)型 static 寄存器型 register 外部型 extern 說明 二 局部變量的存儲方式1 函數(shù)中的局部變量除特別說明為靜態(tài)存儲類型外 一般由編譯系統(tǒng)自動為其動態(tài)分配或釋放存儲單元 這一類變量也叫自動變量 用auto來說明 如 intf inta autointb c 3 intb c 3 說明 auto 可以省略 2 局部靜態(tài)變量如要函數(shù)中局部變量的值在函數(shù)調(diào)用結(jié)束后仍保留原值 即其占用的內(nèi)存單元不釋放 可用 static 來說明變量為 局部靜態(tài)變量 關(guān)于局部靜態(tài)變量的幾點說明 1 局部靜態(tài)變量屬于靜態(tài)存儲類別 2 在編譯時就賦值且賦值一次 而自動變量在函數(shù)運行時賦初值 每調(diào)用一次函數(shù)賦值一次 3 若在定義局部靜態(tài)變量時不賦初值 則編譯時自動賦初值0 而對自動變量其初值不確定 4 局部靜態(tài)變量在函數(shù)內(nèi)有效 調(diào)用結(jié)束后仍然存在 但其它函數(shù)不能引用它 例如 局部靜態(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 示例 例如 局部靜態(tài)變量main staticinta printf d n a 輸出為0如省去static會有警告且a的值不確定 示例 例如 局部靜態(tài)變量局部有效f inta intz staticintc 3 z c a return z main inta 2 printf d f a printf d c 示例 運行結(jié)果為 789 例8 17f 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 2 0 3 abc 1 4 0 1 5 0 6 1 例8 18 p175 求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 結(jié)果 1 12 23 64 245 120 第一次調(diào)用結(jié)束時f的值為1 1并保留第二次調(diào)用結(jié)束時f的值為1 2并保留 8 9 4register變量 一般情況下 變量 包括靜態(tài)存儲方式和動態(tài)存儲方式 的值是存放在內(nèi)存中的 如果有一些變量使用頻繁 則從內(nèi)存存取數(shù)據(jù)將花費較多時間 為了提高執(zhí)行效率 C語言允許將局部變量的值放在CPU的寄存器中 由于對寄存器的存取速度遠高于對內(nèi)存的存取速度 因此這樣就可以提高執(zhí)行效率 這種變量叫做 寄存器變量 用關(guān)鍵字register作聲明 內(nèi)存 CPU 總線 運算器 控制器 寄存器 寄存器變量存放在寄存器中的局部變量叫寄存器變量 用register來說明 例8 19 p175 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 三 全局變量的存儲方式全局變量在函數(shù)以外定義 編譯時分配在靜態(tài)存儲區(qū) 例給定b的值 輸入a和m 求a b和am 說明 可用extern來聲明全局變量 以擴展其作用域 如某個源文件中的函數(shù)要引用另一個源文件中的全局變量 可用extern來說明 2 若希望外部變量只能為本文件中的函數(shù)引用 可在定義外部變量時 用static來說明其成為靜態(tài)外部變量 file1 c 文件file1 cinta main externpower int 聲明外部函數(shù) intb 3 c d m printf enterthenumberaanditspower n scanf d d static與externfile1 cexterninta main file2 cstaticinta fun intn static 示例 文件file2 c文件file2 cexterninta power intn inti inty 1 for i 1 i n i y a 實現(xiàn)a a a a n個a相乘 return y file2 c 示例 四 存儲類別小結(jié) 自學 注意兩點 1 作用域和生存期的概念a 自動變量和寄存器變量在離開函數(shù)后 值不能被引用 值也不存在 b 靜態(tài)外部變量和外部變量在離開函數(shù)后 變量的值仍然存在 且可被引用 c 靜態(tài)局部變量的 可見性 和 存在性 不一致 即離開函數(shù)后 變量的值存在 但不能被引用 2 static對局部變量和全局變量的作用不同 對前者static是使其由動態(tài)存儲方式改變?yōu)殪o態(tài)存儲方式 對后者是使其局部化 但仍為靜態(tài)存儲方式 補充例題1 下列程序的輸出結(jié)果是main intk 4 m 1 p p fun k m printf d p p fun

溫馨提示

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

評論

0/150

提交評論