c++編程自定義函數(shù)_第1頁
c++編程自定義函數(shù)_第2頁
c++編程自定義函數(shù)_第3頁
c++編程自定義函數(shù)_第4頁
c++編程自定義函數(shù)_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1第2-4講 自定義函數(shù)函數(shù)的根本知識(shí)函數(shù)的定義函數(shù)的參數(shù)函數(shù)的返回值函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式調(diào)用的方式嵌套調(diào)用遞歸調(diào)用函數(shù)與數(shù)組局部變量和全局變量變量的動(dòng)態(tài)存儲(chǔ)方式和靜態(tài)存儲(chǔ)方式24.1 概述C語言函數(shù)分為兩類:庫函數(shù)scanf printf sqrt cos strcmp自定義函數(shù)main每個(gè)程序必須有一個(gè)main函數(shù)說明程序運(yùn)行的起始點(diǎn)只用一個(gè)main編程,可能使程序太大、太復(fù)雜例4-1,輸出如下圖內(nèi)容:34在面向過程的程序設(shè)計(jì)中,一個(gè)較為復(fù)雜的程序一般通過模塊化,分解成主模塊與假設(shè)干子模塊的組合,即一個(gè)主函數(shù)與假設(shè)干子函數(shù)?!胺值膬?yōu)點(diǎn):便于自上而下的模塊化編程;通過在適當(dāng)?shù)牡胤绞褂?/p>

2、函數(shù),可以減短源程序的長度;更容易定位和隔離有錯(cuò)誤的函數(shù),便于進(jìn)一步的檢查;函數(shù)可以被其他多個(gè)程序使用。模塊化程序設(shè)計(jì)可以把大型程序組織成小而獨(dú)立的程序段模塊,它們單獨(dú)命名,是單個(gè)的可調(diào)用的程序單元。在C語言中,每個(gè)模塊就是一個(gè)函數(shù),負(fù)責(zé)完成單個(gè)任務(wù)。C語言程序一般都由許多小的函數(shù)組成。5模塊化程序設(shè)計(jì)的特征:每個(gè)模塊只做一件事情。模塊之間的通信只允許通過調(diào)用模塊來實(shí)現(xiàn)。某個(gè)模塊只能被更高一級(jí)的模塊調(diào)用。如果不存在調(diào)用與被調(diào)用關(guān)系,模塊之間是不能直接通信的。所有模塊都是使用控制結(jié)構(gòu)設(shè)計(jì)成單入口、單出口的系統(tǒng)。6例4-2,將例4-1中重復(fù)執(zhí)行的局部改寫成函數(shù)/ 函數(shù)聲明原型/ 函數(shù)調(diào)用/ 函數(shù)定

3、義函數(shù)體函數(shù)派生數(shù)據(jù)類型函數(shù)名標(biāo)識(shí)符函數(shù)具有與之相關(guān)的類型使用之前,函數(shù)名及其類型必須已經(jīng)聲明和定義。7多函數(shù)程序函數(shù)就是含有執(zhí)行某個(gè)特定任務(wù)的代碼塊。函數(shù)一旦設(shè)計(jì)和封裝后,就可以看作是一個(gè)“黑盒子,它從主程序中獲得一些數(shù)據(jù),并返回一個(gè)值。函數(shù)操作的內(nèi)部細(xì)節(jié)對程序的其他局部是不可見的。程序所知道的函數(shù)就是:輸入什么數(shù)據(jù)以及輸出什么數(shù)據(jù)。每個(gè)C程序至少包含一個(gè)函數(shù),即main函數(shù)主函數(shù)。由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意屢次。一個(gè)程序可以保存在一個(gè)或多個(gè)源文件中。各個(gè)文件可以單獨(dú)編譯,并可以與庫中已編譯過的函數(shù)一起加載。84.2 函數(shù)的根本知識(shí)一

4、、函數(shù)的定義 包括以下元素函數(shù)名函數(shù)類型參數(shù)列表局部變量聲明函數(shù)語句返回語句函數(shù)頭函數(shù)體9 函數(shù)定義的一般格式:函數(shù)類型 函數(shù)名形式參數(shù)列表/函數(shù)頭,末尾沒有; 局部變量聲明; 語句1; 語句2; . return 語句;函數(shù)類型,即函數(shù)帶回來的值的類型。缺省為int。如不返回任何值,那么函數(shù)類型應(yīng)指定為void也是C的根本類型之一10形參,以接收從調(diào)用函數(shù)發(fā)送來的數(shù)據(jù)。形參列表包含了變量的聲明,變量之間用逗號(hào)分隔開;一般格式為:type1 name1, type2 name2, , type n name n其中: type1 , type2 , type n 是類型標(biāo)識(shí)符,表示形參的類型;

5、 name1, name2, , name n 是形參名。float quadratic(int a, int b, intc) .double power(double x, int n) .float mul(float x, float y) .int sum(int a, int b) .int sum(int a, b) . 錯(cuò)形參可以沒有,即“無參函數(shù)??梢栽趨?shù)列表的括號(hào)中使用關(guān)鍵字voidvoid PrintLine(void) .函數(shù)在沒被調(diào)用時(shí),形參只是一個(gè)符號(hào)。只有函數(shù)在被調(diào)用時(shí),才由主調(diào)函數(shù)將實(shí)際參數(shù)實(shí)參賦予形參。11函數(shù)體,包含了函數(shù)聲明及完成任務(wù)所需的語句。依次為:

6、1) 局部變量,即本函數(shù)所需的變量;2) 完成函數(shù)任務(wù)的語句;3) return 語句,返回函數(shù)所得的值。不返回函數(shù)值可以省略return語句,但要注意把函數(shù)的返回類型聲明為void。函數(shù)體可以為空,即“空函數(shù)。此函數(shù)不作任何工作,沒有任何實(shí)際作業(yè)??上日嘉?,再補(bǔ)充幾種典型的例如:1213函數(shù)的類型和返回值函數(shù)的返回值類型應(yīng)當(dāng)屬于某個(gè)確定的類型。如果在定義函數(shù)時(shí)不指定函數(shù)類型,系統(tǒng)會(huì)隱含指定函數(shù)類型為int,函數(shù)結(jié)束也需返回一個(gè)int型值。函數(shù)的返回值由 return 語句給出。 return表達(dá)式; 或 return 表達(dá)式;如果函數(shù)沒有返回值,函數(shù)名前的類型標(biāo)識(shí)符為void,return

7、語句可省略不寫。 如果return中的值與函數(shù)值的類型不一致,那么以函數(shù)類型為準(zhǔn)。即在返回時(shí)先作隱含的類型轉(zhuǎn)換,然后再返回。/ 3.5 被轉(zhuǎn)換成 3 后返回給主函數(shù) 14例4-3,編寫一個(gè)函數(shù)用于獲取三個(gè)整數(shù)的最大值。15二、函數(shù)的調(diào)用函數(shù)的調(diào)用一般格式: 函數(shù)名 實(shí)參列表; 實(shí)參列表中的參數(shù)應(yīng)與函數(shù)原型中形參的個(gè)數(shù)相同、類型相符 一一對應(yīng)。 主調(diào)函數(shù)向被調(diào)函數(shù)以值傳遞的方式傳遞。1617 函數(shù)調(diào)用的執(zhí)行過程main( ) mul(10,5)調(diào) mul(10,5) 返回 結(jié)束保存:返回地址當(dāng)前現(xiàn)場恢復(fù):主調(diào)程序現(xiàn)場返回地址18函數(shù)調(diào)用的方式 函數(shù)調(diào)用可以作為一條語句出現(xiàn),這時(shí)函數(shù)可以沒有返回值

8、。PrintLine();函數(shù)調(diào)用也可以出現(xiàn)在表達(dá)式中,這時(shí)必須有一個(gè)明確的返回值。a=mul(10,5);printf(%dn, mul(a, b) );If( mul(m, n) total ) printf(Large);函數(shù)不能用在賦值語句的左邊。 mul(a, b) 15; 錯(cuò) 19函數(shù)的嵌套調(diào)用 C語言 不允許函數(shù)嵌套定義,即:在函數(shù)定義中再定義一個(gè)函數(shù)是非法的。C語言的函數(shù)定義都是互相平行、獨(dú)立的。C語言可以嵌套調(diào)用函數(shù),即在調(diào)用函數(shù)的過程中,又調(diào)用另一個(gè)函數(shù)。main( ) 結(jié)束 return returnfun1( )調(diào)fun1( )fun( )調(diào)fun( )20例4-4,用

9、函數(shù)實(shí)現(xiàn)21三、函數(shù)的聲明函數(shù)原型 返回類型 函數(shù)名形式參數(shù)表;函數(shù)原型是一條程序語句,必須以分號(hào)結(jié)束。C程序中的所有函數(shù)在使用之前都必須聲明,即先聲明后使用。如果被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必聲明。函數(shù)原型聲明可在所有函數(shù)包括main之前。全局原型,該函數(shù)對程序中的所有函數(shù)都是可用的。函數(shù)原型聲明位于某函數(shù)定義之中。局部原型,該函數(shù)主要是被包含它們的函數(shù)使用。標(biāo)準(zhǔn)庫函數(shù)的函數(shù)原型都在頭文件中提供,可用 # include 包含這些原型文件。 函數(shù)原型和函數(shù)定義在返回類型、函數(shù)名和參數(shù)表上必須完全一致。 函數(shù)原型的參數(shù)表可不必包含參數(shù)名稱,而只要包含參數(shù)類型即可。例如: int m

10、ax(int, int,int); 等價(jià)于:int max(int a, int b,int c);22例4-5,隨機(jī)函數(shù)rand 和srand的使用rand(),返回一個(gè)0RAND_MAX(32767)之間的隨機(jī)整數(shù)。RAND_MAX和rand定義在頭文件中計(jì)算機(jī)產(chǎn)生的是一個(gè)偽隨機(jī)數(shù),即這個(gè)隨機(jī)數(shù)序列有一個(gè)長度,會(huì)出現(xiàn)重復(fù)用srand(int seed),其參數(shù)稱為隨機(jī)數(shù)序列種子。即不同的偽隨機(jī)數(shù)序列種子,可以得到不同的偽隨機(jī)數(shù)序列。一般采用系統(tǒng)時(shí)間作為隨機(jī)數(shù)序列種子,例如: srand(unsigned int) time(NULL);23244.3 函數(shù)的類型根據(jù)是否有參數(shù),是否有返回值

11、,可以將函數(shù)分為以下幾種類型:類型1:無參數(shù)、無返回值的函數(shù)。類型2:有參數(shù)、無返回值的函數(shù)。類型3:有參數(shù)、有返回值的函數(shù)。類型4:無參數(shù)、有返回值的函數(shù)。25一、無參數(shù)、無返回值的函數(shù)當(dāng)函數(shù)沒有參數(shù)時(shí),不用從調(diào)用函數(shù)接收任何數(shù)據(jù)。同樣,它也不返回值,調(diào)用函數(shù)不會(huì)從被調(diào)用函數(shù)中接收任何數(shù)據(jù)。 function1() . . function2() . . function2() . . . . . 控制控制無輸入無輸出26例4-6,請編寫一個(gè)含有多個(gè)函數(shù)的程序,這些函數(shù)之間不進(jìn)行任何數(shù)據(jù)通信。2728二、有參數(shù)、無返回值的函數(shù)調(diào)用函數(shù)和被調(diào)用函數(shù)之間的數(shù)據(jù)通信情況: function1()

12、. . function2(a) . . function2(x) . . . . . 參數(shù)值無返回值29實(shí)參和形參在數(shù)量、類型和順序上必須匹配。實(shí)參的值被逐個(gè)賦給形參 main() . function1(a1, a2, a3, ., am) . function1(f1, f2, f3, ., fn) . . 函數(shù)調(diào)用被函數(shù)調(diào)用實(shí)參形參30必須保證函數(shù)調(diào)用有匹配的參數(shù)。實(shí)參形參,多余的實(shí)參將被丟棄;實(shí)參形參,未匹配的形參將被初始化為垃圾值;數(shù)據(jù)類型的任何不匹配情況都將導(dǎo)致傳遞垃圾值。形參必須是有效的變量名,而實(shí)參可以是變量名、表達(dá)式或常量實(shí)參到形參的傳遞實(shí)現(xiàn)的是值的傳遞。被調(diào)函數(shù)中發(fā)生的一

13、切不會(huì)影響到實(shí)參中的變量。例4-7,修改例4-6,使得在調(diào)用函數(shù)中包含參數(shù)。 void PrintLine(char ch); void value(float p, float r, int n);313233三、有參數(shù)、有返回值的函數(shù)為確保程序間更高的可移植性,函數(shù)編碼中往往不包含任何I/O操作。調(diào)用函數(shù)與被調(diào)用函數(shù)之間具有雙向通信。 function1() . . function2(a) . . function2(x) . . . . return(b); 參數(shù)值函數(shù)結(jié)果34例4-8,修改例4-7中的value函數(shù),使其能將計(jì)算的sum值返回給main函數(shù),由main函數(shù)按要求實(shí)現(xiàn)輸

14、出。同時(shí)擴(kuò)展PrintLine函數(shù),可將顯示字符的長度作為參數(shù)傳遞。3536四、無參數(shù)但有一個(gè)返回值的函數(shù)例4-9,設(shè)計(jì)一個(gè)與getchar 類似的函數(shù)來獲取一個(gè)整數(shù)。374.4 函數(shù)調(diào)用時(shí)參數(shù)的傳遞在函數(shù)未被調(diào)用時(shí),函數(shù)的形參并不占有實(shí)際的內(nèi)存空間,也沒有實(shí)際的值。 只有在函數(shù)被調(diào)用時(shí)才為形參分配存儲(chǔ)單元,并將實(shí)參與形參結(jié)合。 實(shí)參類型必須與形參相符。 函數(shù)的參數(shù)傳遞指的就是形參與實(shí)參結(jié)合的過程。一、值調(diào)用 傳值調(diào)用 直接將實(shí)參的值傳遞給形參。 單向傳遞。 形參的改變不會(huì)影響到實(shí)參。38例4-10,傳值調(diào)用,將兩個(gè)數(shù)的值換位。39執(zhí)行主函數(shù)中的函數(shù)調(diào)用語句:swap(x,y);11xa22y

15、b在swap 子函數(shù)中:1x2y1a2b1x2y1x2y2a2b2a1btemp = a;a = b;b = temp;1temp1x2y1temp1temp返回主函數(shù)后:40 例4-11,從鍵盤上輸入字符,要求輸入字符為0-9十個(gè)數(shù)字。41二、 數(shù)組作為函數(shù)參數(shù) 數(shù)組元素可以作為調(diào)用函數(shù)時(shí)的實(shí)參,用法同單個(gè)變量,是單向傳遞 數(shù)組名做函數(shù)的參數(shù)函數(shù)調(diào)用時(shí)只需傳遞數(shù)組名。 在函數(shù)定義中,形參的類型必須與實(shí)參數(shù)組的相同,數(shù)組的大小不必指定。 函數(shù)原型中的參數(shù)也必須定義為一個(gè)數(shù)組。 例4-12:調(diào)用一個(gè)函數(shù)求數(shù)組元素之和4243 在C語言中,數(shù)組名表示的是該數(shù)組的第一個(gè)元素的地址。 傳遞數(shù)組名時(shí),實(shí)

16、際上是把數(shù)組的地址傳遞給被調(diào)用函數(shù)。這樣被調(diào)用函數(shù)中的數(shù)組就指向內(nèi)存中相同的數(shù)組了。因此,在被調(diào)函數(shù)中,對形參數(shù)組元素的任何修改都將反映到調(diào)用函數(shù)的原始數(shù)組(實(shí)參數(shù)組)中。 把參數(shù)的地址傳遞給函數(shù)稱為地址傳遞(pass by address)或指針傳遞。謹(jǐn) 記44例4-13, 請編寫一個(gè)程序,使用一個(gè)函數(shù)來把有10個(gè)整數(shù)元素的數(shù)組按升序排列4546例4-14:調(diào)用一個(gè)函數(shù)求二維數(shù)組元素的最大值47例4-15:矩陣乘法484950三、結(jié)構(gòu)體作為函數(shù)的參數(shù)分別傳遞各個(gè)結(jié)構(gòu)成員像普通變量一樣來處理;如果結(jié)構(gòu)很大,該方法就變得難以控制,效率也不高。傳遞整個(gè)結(jié)構(gòu)將整個(gè)結(jié)構(gòu)的副本傳遞給被調(diào)函數(shù),函數(shù)對結(jié)構(gòu)

17、成員的任何修改都不會(huì)影響實(shí)參。51例,編寫幾個(gè)對點(diǎn)和矩形操作的函數(shù)。定義點(diǎn)的結(jié)構(gòu)類型定義矩形的結(jié)構(gòu)類型521. 定義函數(shù)makepoint,它帶有兩個(gè)整型參數(shù),并返回一個(gè)point類型的結(jié)構(gòu)532. addpoint函數(shù):將兩個(gè)點(diǎn)相加54注意要點(diǎn):當(dāng)函數(shù)的參數(shù)是一個(gè)結(jié)構(gòu)類型時(shí),主調(diào)、被調(diào)函數(shù)中相對應(yīng)的實(shí)參、形參必須為相同的結(jié)構(gòu)類型。當(dāng)函數(shù)的返回值是一個(gè)結(jié)構(gòu)時(shí),必須將返回值賦給調(diào)用函數(shù)中的相同類型的結(jié)構(gòu)變量。和其它類型的參數(shù)一樣,結(jié)構(gòu)類型的參數(shù)也是通過“值傳遞的。例4-16,以將3個(gè)學(xué)生按成績由高到低排序?yàn)槔?5564.5 函數(shù)的遞歸調(diào)用函數(shù)可以直接或間接地調(diào)用自身,稱為遞歸調(diào)用。直接調(diào)用:間接

18、調(diào)用:void fun1(void) fun1( ); / 調(diào)用fun1自身 void fun1(void) fun2( ); void fun2(void) fun1( ); 57 遞歸的條件1須有完成函數(shù)任務(wù)的語句。2有一個(gè)確定是否能防止無限的遞歸調(diào)用的測試。3一個(gè)遞歸調(diào)用語句。該語句的參數(shù)應(yīng)該逐漸逼近不滿足條件,以致最后斷絕遞歸。4先測試,后遞歸調(diào)用。#include void count(int val) / 遞歸函數(shù)可以沒有返回值 if (val 1) count(val -1); printf(ok:, val); / 顯示:“ok:整數(shù)值 printf(n);58例4-17,有5

19、個(gè)人坐在一起,問第5個(gè)人多少歲?他說比第4個(gè)人大2歲。問第4個(gè)人歲數(shù),他說比第3個(gè)人大2歲。問第3個(gè)人歲數(shù),他又說比第2個(gè)人大2歲。問第2個(gè)人歲數(shù),他說比第1個(gè)人大2歲。最后問第1個(gè)人,他說是10歲。請問第5個(gè)人多大?“推理age(5) = age(4) + 2age(4) = age(3) + 2age(3) = age(2) + 2age(2) = age(1) + 2age(1) = 1“總結(jié) 由此計(jì)算出各年齡59遞歸的過程:第一階段:回歸。第二階段:遞推。60例4-18, 計(jì)算n!以5!為例,求值過程:5!5*4*3*2*15*(4!)5!5 * 4!4 * 3!3 * 2!2 * 1

20、!1處理遞歸調(diào)用每個(gè)遞歸調(diào)用向調(diào)用者的返回值5!5 * 4!4 * 3!3 * 2!2 * 1!1返回1返回2!2返回3!6返回4!24返回5!120最后值120616263 例4-19:漢諾塔問題有三根針A ,B,C。A針上有n個(gè)盤子,盤子大小不等,大的在下,小的在上,如圖示。要求把這n個(gè)盤子從A針移到C針,在移動(dòng)過程中可以借助B針,每次只允許移動(dòng)一個(gè)盤子,且在移動(dòng)過程中在三根針上都保持大盤在下,小盤在上。ABC將n個(gè)盤子從A針移到C針可以分解為下面三個(gè)步驟:1)將A上n-1個(gè)盤子移到B針上借助C針;2)把A針上剩下的一個(gè)盤子移到C針上;3)將n-1個(gè)盤子從B針移到C針上借助A針;6465遞

21、歸并不節(jié)省存儲(chǔ)器的開銷,因?yàn)檫f歸調(diào)用過程中必須在某個(gè)地方維護(hù)一個(gè)存儲(chǔ)處理值的棧。遞歸的執(zhí)行速度并不快,但遞歸代碼比較緊湊,并且比相應(yīng)的非遞歸代碼更易于編寫與理解。在描述樹等遞歸定義的數(shù)據(jù)結(jié)構(gòu)時(shí),使用遞歸尤其方便。664.6 局部變量和全局變量一、局部變量在函數(shù)內(nèi)部定義的變量,僅在該函數(shù)內(nèi)有效。 不同函數(shù)中可以使用相同名字的變量,互不干擾。 局部變量在定義時(shí)沒有明確的初始化值。 在函數(shù)開始運(yùn)行時(shí),局部變量在棧區(qū)中被分配空間,函數(shù)退出時(shí),局部變量隨之消失。形式參數(shù)也是局部變量。例: void main( ) void func( ) int s; int s; 67二、全局變量 在任何函數(shù)之外定義

22、的變量,也稱為外部變量。 可以被本文件中其它函數(shù)所共用。它的有效范圍是從定義變量的位置開始一直到根源文件結(jié)束。 存放在內(nèi)存的全局?jǐn)?shù)據(jù)區(qū)。 由編譯器建立,默認(rèn)初始化為0。 int n=5; / 全局變量 void func( ) void main( ) int s; int m = n; n = s; 68說明全局變量的作用是增加了函數(shù)之間數(shù)據(jù)聯(lián)系的渠道。假設(shè)在一個(gè)函數(shù)中改變了全局變量的值,就能影響到其它函數(shù)。不成文的規(guī)定:全局變量的第一個(gè)字母用大寫表示。不在特別必要時(shí),盡量不要使用全局變量全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元。降低了函數(shù)的通用性。假設(shè)外部變量與其它文件的變量同名,移植

23、時(shí)就會(huì)出現(xiàn)問題,降低了程序的可靠性和通用性。降低程序的清晰性。一般要求把C程序中的函數(shù)做成一個(gè)封閉體,除了可以通過“實(shí)參形參的渠道與外界發(fā)生聯(lián)系外,沒有其它渠道移植性好,可讀性強(qiáng)。694.7 作用域與可見性作用域又稱作用范圍,它指的是標(biāo)識(shí)符的有效范圍 可見性指的是標(biāo)識(shí)符是否可以被引用。一、作用域分類函數(shù)原型作用域 是C 程序中最小的作用域 開始于函數(shù)原型聲明的左括號(hào),結(jié)束于函數(shù)原型聲明的右括號(hào)。 double area ( double width, double length);70塊作用域局部作用域 塊是一對大括號(hào)括起來的一段程序 塊語句 在塊中聲明的標(biāo)識(shí)符,其作用域從聲明處開始,一直到塊

24、結(jié)束的大括號(hào)為止。 具有塊作用域的標(biāo)識(shí)符稱作局部標(biāo)識(shí)符。void fun( int y ) / y 的作用域從此開始 int a,b; / a, b的作用域從此開始 if ( y0 ) int x; / x 的作用域從此開始 x = a + b; / x 的作用域到此結(jié)束 / a, b, y 的作用域到此結(jié)束 71void fun( int n) if( n5) int i; i=n; printf(%dn, i); else double i; i=n; printf(%fn, i); printf(%dn, i); / int i 的作用域從此開始/ int i 的作用域到此結(jié)束/ dou

25、ble i 的作用域從此開始/ double i 的作用域到此結(jié)束/ error! i 無定義72文件作用域全局作用域 在所有函數(shù)定義之外說明; 開始于聲明點(diǎn),結(jié)束于文件尾(全局變量。 在頭文件的文件作用域中所進(jìn)行的聲明,假設(shè)該頭文件被一個(gè)源文件嵌入,那么聲明的作用域也擴(kuò)展到該源文件中,直到源文件結(jié)束。int number;int value; void main( ) a = 1; / error! a 無定義 number = 0; value = number + 1; printf(“%dn, i); int a;73二、可見性 程序運(yùn)行到某一點(diǎn),能夠引用到的標(biāo)識(shí)符,就是該處可見的標(biāo)識(shí)

26、符。 作用域可見性的一般規(guī)那么: 標(biāo)識(shí)符要聲明在前,引用在后。 在同一作用域中,不能聲明同名的標(biāo)識(shí)符。 在沒有互相包含關(guān)系的不同的作用域中聲明的同名標(biāo)識(shí)符互不影響。 如果在兩個(gè)或多個(gè)具有包含關(guān)系的作用域中聲明了同名標(biāo)識(shí)符,那么外層標(biāo)識(shí)符在內(nèi)層不可見。74例4-20,作用域可見性實(shí)例175例4-21,作用域可見性實(shí)例2764.8 變量的存儲(chǔ)類型一、動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式程序的內(nèi)存區(qū)域:靜態(tài)存儲(chǔ)方式:在程序的運(yùn)行期間分配固定的存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ)方式:在程序的運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間。 程序內(nèi)存空間 代碼區(qū)(code area)全局?jǐn)?shù)據(jù)區(qū)(data area) 堆區(qū)(heap are

27、a) 棧區(qū)(stack area)存放程序的代碼全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)程序的動(dòng)態(tài)數(shù)據(jù)程序的局部數(shù)據(jù)77動(dòng)態(tài)存儲(chǔ)區(qū)存放的數(shù)據(jù)有:函數(shù)的形式參數(shù)自動(dòng)變量函數(shù)調(diào)用時(shí)的現(xiàn)場保護(hù)和返回地址在程序執(zhí)行過程中,如果在同一個(gè)程序中兩次調(diào)用同一函數(shù),分配給此函數(shù)中局部變量的存儲(chǔ)空間地址可能是不相同的。C語言中,變量和函數(shù)的屬性除了具有數(shù)據(jù)類型外,還具有存儲(chǔ)類型: auto自動(dòng)的:采用堆棧方式分配內(nèi)存空間,屬于暫時(shí)性存儲(chǔ),其存儲(chǔ)空間可以被假設(shè)干變量屢次覆蓋使用。 static靜態(tài)的:在內(nèi)存中是以固定地址存放的,在整個(gè)程序運(yùn)行期間都有效。 register存放器的:存放在通用存放器中。 extern外部的:在所有函數(shù)和

28、程序段中都可引用。78二、auto變量函數(shù)的形參、其中定義的局部變量等,如不專門聲明為static,都是動(dòng)態(tài)地分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。 自動(dòng)變量“auto關(guān)鍵字可以省略。假設(shè)在定義變量時(shí)不寫auto,那么隱含確定為“自動(dòng)存儲(chǔ)類型。程序中大多數(shù)變量屬于自動(dòng)變量。auto int a=3, b; int a=3, b; 等價(jià)79三、用static聲明局部變量靜態(tài)局部變量,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。變量在程序的整個(gè)運(yùn)行期間都不釋放。 static int i; static char bufBUFSIZE; 靜態(tài)存儲(chǔ)變量,假設(shè)無顯式初始化,那么在程序編譯時(shí)自動(dòng)初始化為 0。即只初始

29、化一次,以后每次調(diào)用函數(shù)時(shí)不再重新賦初值,而只是保存上次函數(shù)調(diào)用結(jié)束時(shí)的值。雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其它函數(shù)是不能引用它的。80例4-22,靜態(tài)存儲(chǔ)變量舉例81第n次調(diào)用調(diào)用時(shí)初值調(diào)用結(jié)束時(shí)的值bcbca+b+c第1次第2次第3次000345111456891082四、register變量局部變量的值直接存放在CPU中的存放器中。只有局部自動(dòng)變量和形式參數(shù)可以作為存放器變量,其它如全局變量、局部靜態(tài)變量不行。 register int x; register char c; f(register unsigned m, register long n) register int I; register static int a, b; 錯(cuò)!一個(gè)計(jì)算機(jī)系統(tǒng)中的存放器數(shù)目是有限的,不能定義任意多個(gè)存放器變量。83五、外部變量即全局變量,是在函數(shù)的外部定義的,它的作用域?yàn)閺淖兞康亩x處開始,到本程序文件的末尾。在此作用域中,全局變量

溫馨提示

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

評(píng)論

0/150

提交評(píng)論