




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章函數(hánshù)
8.1概述 一個較大的程序一般應分為若干個程序模塊,每一個模塊用來實現一個特定的功能。所有(suǒyǒu)的高級語句中都有子程序這個概念,用子程序實現模塊的功能。在C語言中,子程序的作用是由函數來完成的。一個C程序可由一個主函數和若干個其他函數構成。由主函數調用其他函數,其他函數也可以相互調用。同一個函數可以被一個或多個函數調用任意多次。 在程序設計中,常將一些常用的功能模塊編寫成函數,放在公共函數庫中供大家選用。程序設計人員要善于利用函數,以減少重復編寫程序段的工作量。精品資料[例8.1]函數調用的簡單(jiǎndān)例子#include<stdio.h>voidmain(){ voidprintstar(); voidprint_message(); printstar(); print_message(); printstar();}voidprintstar(){ printf(“**********\n”);}voidprint_message(){ printf(“Howdoyoudo!\n”);}精品資料說明(shuōmíng): (1)一個C程序由一個或多個程序模塊組成,每一個程序模塊作為一個源程序文件。對較大的程序,一般不希望把所有內容全放在一個文件中,而是將它們放在若干個源文件中,再由若干個源程序文件組成一個C程序。一個源程序文件可以為多個C程序共用。 (2)一個源程序文件由一個或多個函數以及其他有關內容(如命令行、數據定義等)組成。一個源程序是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯的,而不是以函數為單位進行編譯的。 (3)C程序的執(zhí)行是從main函數開始的,如是在main函數中調用其他函數,在調用后流程返回到main函數,在main函數中結束整個程序的運行(yùnxíng)。 (4)所有函數都是平行的,即在定義函數時是分別進行的,是相互獨立的。一個函數并不從屬于另一個函數,即函數不能嵌套定義。函數間可以相互調用,但不能調用main函數。main函數是系統(tǒng)調用的。精品資料(5)從用戶使用的角度看,函數有兩種。①標準函數。標準函數即庫函數,它是由系統(tǒng)提供的,用戶不必自己定義而直接使用它們。②用戶自己定義的函數。它是用以解決用戶專門需要的函數。(6)從函數的形式看,函數分兩類。①無參函數。在調用(diàoyòng)無參函數時,主調函數不向被調用(diàoyòng)函數傳遞數據。無參函數一般用來執(zhí)行指定的一組操作。無參函數可以帶回或不帶會函數值,但一般以不帶回函數值的居多。②有參函數。在調用(diàoyòng)函數時,主調函數在調用(diàoyòng)被調用(diàoyòng)函數時,通過參數向被調用(diàoyòng)函數傳遞數據,一般情況下,執(zhí)行被調用(diàoyòng)函數時會得到一個函數值,供主調函數使用。精品資料8.2函數定義的一般(yībān)形式
8.2.1無參函數定義的一般(yībān)形式 定義無參函數(hánshù)的一般形式為: 類型標識符函數(hánshù)名() { 聲明部分 語句部分 } 在定義函數(hánshù)時要用“類型標識符”指定函數(hánshù)值的類型,即函數(hánshù)帶回來的值的類型。精品資料8.2.2有參函數定義的一般(yībān)形式定義有參函數的一般形式為:類型標識符函數名(形式參數表列){ 聲明(shēngmíng)部分 語句部分}例如:intmax(intx,inty){ intz; z=x>y?x:y; returnz;}精品資料8.2.3空函數(hánshù)在程序設計(chénɡxùshèjì)中有時會用到空函數,它的形式為: 類型說明符函數名() { }精品資料8.3函數(hánshù)參數和函數(hánshù)的值
8.3.1形式參數和實際參數 在調用函數(hánshù)時,大多數情況下,主調函數(hánshù)和被調用函數(hánshù)之間有數據傳遞關系。在定義函數(hánshù)時函數(hánshù)名后面括號中的變量名稱為“形式參數”(簡稱“形參”),在主調函數(hánshù)中調用一個函數(hánshù)時,函數(hánshù)名后面括號中的參數(可以是一個表達式)稱為“實際參數”(簡稱“實參”)。精品資料[例8.2]調用函數時的數據(shùjù)傳遞#include<stdio.h>voidmain(){ intmax(intx,inty); inta,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“Maxis%d”,c);}intmax(intx,inty){ intz; z=x>y?x:y; returnz;}精品資料關于形參與(cānyù)實參的說明: (1)在定義函數中指定的形參,在未出現函數調用時,它們并不占內存中的存儲單元。只有在發(fā)生函數調用時,函數max中的形參才被分配內存單元。在調用結束后,形參所占的內存單元也被釋放。 (2)實參可以是常量、變量或表達式。但要求它們有確定的值。在調用時將實參的值賦給形參。 (3)在被定義的函數中,必須指定形參的類型。 (4)實參與形參的類型應相同或賦值兼容。 (5)實參向形參的數據傳遞是“值傳遞”,單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。在內存中,實參單元與形參單元是不同的單元。在調用函數時,給形參分配存儲單元,并將實參對應的值傳遞給形參,調用結束后,形參單元被釋放,實參單元仍保留并維持(wéichí)原值。因此,在執(zhí)行一個被調用函數時,形參的值如果發(fā)生改變,并不會改變主調函數的實參的值。精品資料8.3.2函數(hánshù)的返回值 通過函數調用使主調函數能得到一個確定的值,這就是函數的返回值。 (1)函數的返回值是通過函數中的return語句獲得的。return語句將被調用函數中的一個確定值帶回主調函數中去。 (2)函數值的類型。既然函數有返回值,這個值當然應屬于某一個確定的類型,應當在定義函數時指定(zhǐdìng)函數值的類型。 (3)在定義函數時指定(zhǐdìng)的函數類型一般應該和return語句中的表達式類型一致。如果函數值的類型和return語句中表達式的值不一致,則以函數類型為準。對數值型數據,可以自動進行類型轉換。即函數類型決定返回值的類型。精品資料[例8.3]返回值類型與函數(hánshù)類型不同#include<stdio.h>voidmain(){ intmax(flaotx,floaty); floata,b; intc; scanf(“%f,%f”,&a,&b); c=max(a,b); printf(“Maxis%d\n”,c);}intmax(floatx,floaty){ floatz; z=x>y?x:y; returnz;}精品資料 (4)對于不帶回值的函數,應當用“void”定義函數為“無類型”(或稱“空類型”)。這樣,系統(tǒng)(xìtǒng)就保證不使函數帶回任何值,即禁止調用函數中使用被調用函數的返回值。此時在函數體中不得出現return語句。精品資料8.4函數(hánshù)的調用
8.4.1函數(hánshù)調用的一般形式 函數調用的一般形式為 函數名(實參表列); 如果是調用無參函數,則“實參表列”可以沒有,但括號不能省略。如果實參表列包含多個實參,則各參數(cānshù)間用逗號隔開。實參與形參的個數應相等,類型應匹配。實參與形參按順序對應,一一傳遞數據。但應說明,如果實參表列包括多個實參,對實參求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實參的值,有的系統(tǒng)則按自右至左順序。精品資料[例8.4]實參求值的順序(shùnxù)#include<stdio.h>voidmain(){ intf(inta,intb); inti=2,p; p=f(i,++i); printf(“%d\n”,p);}intf(inta,intb){ intc; if(a>b)c=1; elseif(a==b)c=0; elsec=-1; returnc;}精品資料8.4.2函數調用的方式(fāngshì) 按函數在程序中出現的位置來分,可以有以下3種函數調用方式。 1.函數語句(yǔjù) 把函數調用作為一個語句(yǔjù)。這時不要求函數帶回值,只要求函數完成一定的操作。 2.函數表達式 函數出現在一個表達式中,這種表達式稱為函數表達式。這時要求函數帶回一個確定的值以參加表達式的運算。 3.函數參數 函數調用作為一個函數的實參。精品資料8.4.3對被調用函數(hánshù)的聲明和函數(hánshù)原型 在一個函數中調用另一個函數需要具備的條件如下。 (1)首先被調用的函數必須是已經存在的函數(是庫函數或用戶自己定義的函數)。但光有這一條件還不夠。 (2)如果使用庫函數,還應該在本文件開頭用#include命令(mìnglìng)將調用有關庫函數時所需用到的信息“包含”到本文件中去。 (3)如果使用用戶自己定義的函數,而該函數的位置在調用它的函數(即主調函數)的后面(在同一個文件中),應該在主調函數中對被調用的函數作聲明。精品資料[例8.5]對被調用的函數(hánshù)作聲明#include<stdio.h>voidmain(){ floatadd(floatx,floaty); floata,b,c; scanf(“%f,%f”,&a,&b); c=add(a,b); printf(“sumis%f\n”,c);}floatadd(floatx,floaty){ floatz; z=x+y; returnz;}精品資料 在函數調用(diàoyòng)之前用函數原型做了函數聲明。因此編譯系統(tǒng)記下了所需調用(diàoyòng)的函數的有關信息。編譯系統(tǒng)根據函數的原型對函數的調用(diàoyòng)的合法性進行全面的檢查。與函數原型不匹配的函數調用(diàoyòng)會導致編譯出錯,它屬于語法錯誤。用戶根據屏幕顯示的出錯信息很容易發(fā)現和糾正錯誤。精品資料 函數原型的一般形式有兩種,分別(fēnbié)為 (1)函數類型函數名(參數類型1,參數類型2,…,參數類型n); (2)函數類型函數名(參數類型1參數名1,參數類型2參數名2,…,參數類型n參數名n);精品資料說明(shuōmíng): (1)如果被調用函數的定義出現在主調函數之前,可以不必加以(jiāyǐ)聲明。 (2)如果已在文件的開頭(在所有函數之前),已對本文件中所調用的函數進行了聲明,則在各函數中不必對其所調用的函數再作聲明。精品資料8.5函數(hánshù)的嵌套調用 C語言的函數定義是相互平行、獨立(dúlì)的。在定義函數時,一個函數內不能包含另一個函數。 C語言不能嵌套定義函數,但可以嵌套調用函數,在調用一個函數的過程中,又調用另一個函數。精品資料[例8.6]函數(hánshù)嵌套調用的應用精品資料8.6函數(hánshù)的遞歸調用 在調用一個函數的過程中又出現直接(zhíjiē)或間接地調用該函數本身,稱為函數的遞歸調用。精品資料[例8.7]有5個人坐在一起,問第5個人多少歲?他說比第4個人大2歲。問第4個人歲數(suìshu),他說比第3個人大2歲。問第3個人,又說比第2個人大2歲。問第2個人,說比第1個人大2歲。最后問第1個人,他說是10歲。請問第5個人多大精品資料[例8.8]用遞歸方法(fāngfǎ)求n!精品資料[8.9]Hanoi塔問題。古代有一個梵塔,塔內有3個座A、B、C,開始(kāishǐ)時A座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移到C座,但每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座,要求編程序輸出移動的步驟精品資料8.7數組作為(zuòwéi)函數參數 前面已經介紹了可以用變量作函數參數,顯然,數組元素也可以作函數參數,其用法(yònɡfǎ)與變量相同。此外,數組名也可以作實參和形參,傳遞的是數組首元素的地址。精品資料8.7.1數組元素(yuánsù)作函數實參 由于實參可以是表達式,而數組元素可以是表達式的組成部分,因此數組元素當然可以作為函數的實參,與用變量作實參一樣,是單向傳遞,即“值傳送”方式。 [例8.10]有兩個數組a和b,各有10個元素,將它們對應地逐個比較(bǐjiào)(即a[0]與b[0]比,a[1]與b[1]比……)。如果a數組中的元素大于b數組中的相應元素的數目多于b數組中元素大于a數組中相應元素的數目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次為不同的值),則認為a數組大于b數組,并分別統(tǒng)計出兩個數組相應元素大于、等于、小于的次數。精品資料8.7.2數組名作函數參數 可以用數組名作函數參數,此時形參應當用數組名或用指針(zhǐzhēn)變量。 [例8.11]有一個一維數組score,內放10個學生成績,求平均成績精品資料說明(shuōmíng): (1)用數組名作函數參數,應該(yīnggāi)在主調函數和被調函數分別定義數組。 (2)實參數組與形參數組類型應一致,如不一致,結果將出錯。 (3)在被調用函數中聲明了形參數組的大小為10,但在實際上,指定其大小是不起任何作用的,因為C語言編譯對形參數組大小不做檢查,只是將實參數組的首元素的地址傳給形參數組。因此,形參數組名獲得了實參數組的首元素的地址。 (4)形參數組可以不指定大小,在定義數組時在數組名后面跟一個空的方括號。有時為了在被調用函數中處理數組元素的需要,可以另設一個形參,傳遞需要處理的數組元素的個數。 [例8.12]形參數組不定義長度精品資料 (5)用數組名作函數實參時,不是把數組元素的值傳遞給形參,而是把實參數組的首元素的地址傳遞給形參數組,這樣兩個數組就共占同一段內存(nèicún)單元。形參數組中各元素的值如發(fā)生變化會使實參數組元素的值同時發(fā)生變化。精品資料[例8.13]用選擇法對數組中10個整數按由小到大排序。所謂選擇法就是先將10個數中最小的數與a[0]對換;再將a[1]到a[9]中最小的數與a[1]對換……每比較(bǐjiào)一輪,找出一個未經排序的數中最小的一個。共比較(bǐjiào)9輪精品資料8.7.3多維數組名作函數參數 多維數組元素可以作函數參數。 用多維數組名作為函數的實參和形參,在被調用函數中對形參數組定義時可以指定每一維的大小,也可以省略第一維的大小說明。但是不能把第二維以及(yǐjí)其他高維的大小說明省略。精品資料[例8.14]有一個3×4矩陣(jǔzhèn),求所有元素最大值 先使變量max的初值為矩陣中第一個元素的值,然后將矩陣中各個元素的值與max相比,每次比較后都把“大者”存放(cúnfàng)在max中,全部元素比較完后,max的值就是所有元素的最大值。精品資料8.8局部變量和全局變量
8.8.1局部變量 在一個函數內部定義的變量是內部變量,它只在本函數范圍內有效(yǒuxiào),也就是說只有在本函數內才能使用它們,在此函數以外是不能使用這些變量的。這稱為“局部變量”。例如: floatf1(inta){ intb,c; …… } charf2(intx,inty){ inti,j; …… } voidmain(){ intm,n; …… }精品資料說明(shuōmíng): (1)主函數中定義的變量也只在主函數中有效,而不因為在主函數中定義而在整個文件或程序中有效。主函數也不能使用其他(qítā)函數中定義的變量。 (2)不同函數中可以使用相同名字的變量,它們代表不同的對象,互不干擾。 (3)形式參數也是局部變量。 (4)在一個函數內部,可以在復合語句中定義變量,這些變量只在本復合語句中有效,這種復合語句也稱為“分程序”或“程序塊”。精品資料8.8.2全局變量 程序的編譯單位是源程序文件,一個源文件可以包含一個或若干個函數。在函數內定義的變量是局部變量,而在函數之外定義的變量稱為外部變量,外部變量是全局變量。全局變量可以為本文件中其他函數所共用。它的有效(yǒuxiào)范圍為從定義變量的位置開始到本源文件結束。精品資料例如(lìrú):intp=1,q=5;floatf1(inta){ intb,c; ……}charc1,c2;charf2(intx,inty){ inti,j; ……}voidmain(){ intm,n; ……}精品資料說明(shuōmíng): (1)設置全局變量的作用是增加了函數間數據聯系的渠道。 [例8.15]有一個一維數組,內放10個學生成績,寫一個函數,求出平均分、最高分和最低分 (2)建議不在必要時不要使用全局變量,原因如下: ①全局變量在程序的全部(quánbù)執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。 ②它使函數的通用性降低了,因為函數在執(zhí)行時要依賴于其所在的外部變量。 ③使用全局變量過多,會降低程序的清晰性,難以清除地判斷出每個瞬時各個外部變量的值。 (3)如果在同一個源文件中,外部變量與局部變量同名,則在局部變量的作用范圍內,外部變量被“屏蔽”,即它不起作用。 [例8.16]外部變量與局部變量同名精品資料8.9變量的存儲類別(lèibié)
8.9.1動態(tài)存儲方式與靜態(tài)存儲方式 從變量(biànliàng)的作用域(即從空間)角度來分,可以分為全局變量(biànliàng)和局部變量(biànliàng)。 從變量(biànliàng)值存在的時間(即生存期)角度來分,可以分為靜態(tài)存儲方式和動態(tài)存儲方式。 所謂靜態(tài)存儲方式是指在程序運行期間由系統(tǒng)分配固定的存儲空間的方式。而動態(tài)存儲方式則是在程序運行期間根據需要進行動態(tài)的分配存儲空間的方式。精品資料 程序的存儲空間可以分為三部分: 程序區(qū) 靜態(tài)存儲區(qū) 動態(tài)(dòngtài)存儲區(qū) 數據分別存放在靜態(tài)存儲區(qū)和動態(tài)(dòngtài)存儲區(qū)中。全局變量全部存放在靜態(tài)存儲區(qū)中,在程序開始執(zhí)行時給全局變量分配存儲區(qū),程序執(zhí)行完畢就釋放。在程序執(zhí)行過程中它們占據固定的存儲單元,而不是動態(tài)(dòngtài)地進行分配和釋放。
精品資料 在動態(tài)存儲區(qū)中存放以下數據: ①函數形式參數。在調用函數時給形參分配存儲空間。 ②自動變量(未加static聲明的局部變量) ③函數調用時的現場保護和返回地址(dìzhǐ)等。 對以上這些數據,在函數調用開始時分配動態(tài)存儲空間,函數結束時釋放這些空間。在程序執(zhí)行過程中,這種分配和釋放是動態(tài)的,如果在一個程序中兩次調用同一函數,分配給此函數中局部變量的存儲空間地址(dìzhǐ)可能是不同的。如果一個程序包含若干個函數,每個函數中的局部變量的生存期并不等于整個程序的執(zhí)行周期,它只是程序執(zhí)行周期的一部分。根據函數調用的需要,動態(tài)地分配和釋放存儲空間。精品資料 在C語言中,每一個變量和函數有兩個屬性:數據類型和數據的存儲類別。存儲類別指的是數據在內存中存儲的方式。存儲方式分為兩大類:靜態(tài)存儲類和動態(tài)存儲類。具體包含4種:自動的(auto)、靜態(tài)的(static)、寄存器的(register)、外部的(extern)。根據(gēnjù)變量的存儲類別,可以知道變量的作用域和生存期。精品資料8.9.2auto變量(biànliàng) 函數中的局部變量,如果不專門聲明為static存儲類別,都是動態(tài)地分配存儲空間的,數據存儲在動態(tài)存儲區(qū)中。函數中的形參和在函數中定義的變量(包括(bāokuò)在復合語句中定義的變量),都屬此類,在調用該函數時系統(tǒng)會給它們分配存儲空間,在函數調用結束時就自動釋放這些存儲空間。因此這類局部變量稱為自動變量。自動變量用關鍵字auto作存儲類別的聲明。精品資料例如(lìrú):intf(inta){ autointb,c=3; ……}精品資料8.9.3用static聲明(shēngmíng)局部變量 有時希望函數中的局部變量的值在函數調用結束后不消失而保留(bǎoliú)原值,即其占用的存儲單元不釋放,在下一次該函數調用時,該變量已有值,就是上一次函數調用結束時的值。這時就應該指定該局部變量為“靜態(tài)局部變量”,用關鍵字static進行聲明。精品資料[例8.17]考察(kǎochá)靜態(tài)局部變量的值#include<stdio.h>voidmain(){ intf(int); inta=2,i; for(i=0;i<3;i++) printf(“%d“,f(a));}intf(inta){ autointb=0; staticintc=3; b=b+1; c=c+1; return(a+b+c);}精品資料對靜態(tài)(jìngtài)局部變量的說明 (1)靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內分配存儲單元。在程序整個運行期間都不釋放。而自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,占動態(tài)存儲區(qū)空間而不占靜態(tài)存儲區(qū)空間,函數調用結束(jiéshù)后即釋放。 (2)對靜態(tài)局部變量是在編譯時賦初值的,即只賦初值一次,在程序運行時它已有初值。以后每次調用函數時不再重新賦初值而只是保留上次函數調用結束(jiéshù)時的值。而對自動變量賦初值,不是在編譯時進行的,而是在函數調用時進行,每調用一次函數重新給一次初值,相當于執(zhí)行一次賦值語句。 (3)如在定義局部變量時不賦初值的話,則對靜態(tài)局部變量來說,編譯時自動賦初值0(對數值型變量)或空字符(對字符變量)。而對自動變量而說,如果不賦初值則它的值是一個不確定的值。這是由于每次函數調用結束(jiéshù)后存儲單元已釋放,下次調用時又重新另分配存儲單元,而所分配的單元中的值是不確定的。 (4)雖然靜態(tài)局部變量在函數調用結束(jiéshù)后仍然存在,但其他函數是不能引用它的。精品資料 需要用靜態(tài)局部變量的情況如下。 (1)需要保留函數上一次調用結束時的值。 [例8.18]輸出1到5的階乘值 (2)如果初始化后,變量只被引用而不改變其值,則這時用靜態(tài)局部變量比較方便,以免每次調用時重新賦值。 但是應該看到,用靜態(tài)存儲要多占內存(長期占用不釋放,而不能像動態(tài)存儲那樣一個存儲單元可供多個變量使用,節(jié)約內存),而且降低了程序的可讀性,當調用次數多時往往弄不清靜態(tài)局部變量的當前值是什么。因此,若非(ruòfēi)必要,不要多用靜態(tài)局部變量。精品資料8.9.4register變量(biànliàng) 一般情況下,變量(包括靜態(tài)存儲方式和動態(tài)存儲方式)的值是存放在內存中的。當程序中用到哪一個變量的值時,由控制器發(fā)出指令將內存中該變量的值送到運算器中。經過運算器進行運算,如果需要存數,再從運算器將數據送到內存存放。 如果有一些變量使用頻繁(例如,在一個函數中執(zhí)行10000次循環(huán),每次循環(huán)中都要引用某局部變量),則為存取變量的值要花費不少時間。為提高執(zhí)行效率,C語言允許將局部變量的值放在CPU中的寄存器中,需要用時直接從寄存器取出參加(cānjiā)運算,不必再到內存中去存取。由于對寄存器的存取速度遠高于對內存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關鍵字register作聲明。
精品資料[例8.19]使用(shǐyòng)寄存器變量#include<stdio.h>voidmain(){ longfac(long); longi,n; scanf(“%ld”,&n); for(i=1;i<=n;i++) printf(“%ld!=%ld\n”,i,fac(i));}longfac(longn){ registerlongi,f=1; for(i=1;i<=n;i++) f=f*i; returnf;}精品資料說明(shuōmíng): (1)只有局部自動變量和形式參數可以(kěyǐ)作為寄存器變量,其他(如全局變量)不行,在調用一個函數時占用一些寄存器以存放寄存器變量的值,函數調用結束釋放寄存器。此后,在調用另一個函數時又可以(kěyǐ)利用它來存放該函數的寄存器變量。 (2)一個計算機系統(tǒng)中的寄存器數目是有限的,不能定義任意多個寄存器變量。不同的系統(tǒng)允許使用的寄存器數目是有限的,而且對register變量的處理方法也是不同的,有的系統(tǒng)對register變量當作自動變量處理,分配內存單元,并不真正把它們存放在寄存器中,有的系統(tǒng)只允許將int、char和指針型變量定義為寄存器變量。 (3)局部靜態(tài)變量不能定義為寄存器變量。精品資料8.9.5用extern聲明(shēngmíng)外部變量 外部變量是在函數的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內,全局變量可以(kěyǐ)為程序中各個函數所引用。編譯時將外部變量分配在靜態(tài)存儲區(qū)。 有時需要用extern來聲明外部變量,以擴展外部變量的作用域。精品資料1、在一個文件內聲明外部(wàibù)變量 如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件結束。如果在定義點之前的函數想引用該外部變量,則應該在引用之前用關鍵字extern對該變量作“外部變量聲明”,表示該變量是一個已經(yǐjing)定義的外部變量。有了此聲明,就可以從“聲明”處起,合法地使用該外部變量。精品資料[例8.20]用extern聲明(shēngmíng)外部變量,擴展它在程序文件中的作用域#include<stdio.h>voidmain(){ intmax(int,int); externA,B; printf(“%d\n”,max(A,B));}intA=13,B=-8;intmax(intx,inty){ intz; z=x>y?x:y; returnz;}精品資料2、在多文件的程序(chéngxù)中聲明外部變量 如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量Num,不能分別在兩個文件中各自定義(dìngyì)一個外部變量Num,否則在進行程序的連接時會出現“重復定義(dìngyì)”的錯誤。正確的做法是:在任一個文件中定義(dìngyì)外部變量Num,而在另一個文件中用extern對Num作“外部變量聲明”。即“externNum;”。在編譯和連接時,系統(tǒng)會由此知道Num是一個已在別處定義(dìngyì)的外部變量,并將在另一文件中定義(dìngyì)的外部變量的作用域擴展到本文件,在本文件中可以合法地引用外部變量Num。精品資料[例8.21]用extern將外部(wàibù)變量的作用域擴展到其他文件#include<stdio.h>intA;voidmain(){ intpower(int); intb=3,c,d,m; printf(“enterthenumberaanditspowerm:\n”); scanf(“%d,%d”,&A,&m); c=A*b; printf(“%d**%d=%d\n”,A,m,d);}externA;intpower(intn){ inti,y=1; for(i=1;i<=n;i++) y*=A; returny;}精品資料8.9.6用static聲明(shēngmíng)外部變量 有時在程序設計中希望(xīwàng)某些外部變量只限于被本文件引用,而不能被其他文件引用。這時可以在定義外部變量時加一個static聲明。 例如: file1.c file2.c staticintA; externintA; voidmain() voidfun(intn) { { …… …… } A=A*n; …… }精品資料8.9.7關于(guānyú)變量的聲明和定義 對變量而言,聲明與定義的關系稍微復雜一些。在聲明部分出現的變量有兩種情況:一種是需要建立存儲空間的(如:inta;),另一種是不需要建立存儲空間(如:externa;)。前者稱為“定義性聲明”,或簡稱定義。后者稱為“引用(yǐnyòng)性聲明”。廣義地說,聲明包括定義,但并非所有的聲明都是定義。對“inta;”而言,它既是聲明,又是定義。而對“externa;”而言,它是聲明而不是定義。一般為了敘述方便,把建立存儲空間的聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明。顯然這里指的聲明是狹義的,即非定義性聲明。例如: voidmain() { externA; …… } intA;精品資料8.9.8存儲類別(lèibié)小結 從上可知,對一個數據的定義,需要指定兩種屬性:數據類型和存儲類別,分別使用兩個關鍵字。例如: staticinta; autocharc; registerintd; 此外,可以(kěyǐ)用extern聲明變量為已定義的外部變量,例如: externb;精品資料下面(xiàmian)從不同角度做些歸納: (1)從作用域角度分,有局部變量和全局變量。它們采用(cǎiyòng)的存儲類別如下: 局部變量: 自動變量,即動態(tài)局部變量(離開函數,值就消失) 靜態(tài)局部變量(離開函數,值仍保留) 寄存器變量(離開函數,值就消失) (形式參數可以定義為自動變量和寄存器變量) 全局變量: 靜態(tài)外部變量(只限本文件引用) 外部變量(即非靜
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《漢語閱讀教程》課件-教學課件:漢語閱讀教程
- 校園賽事贊助合作合同(2篇)
- 2025聯營合作超市合同模板
- 2025裝飾合作協(xié)議合同書樣本
- 可復性疝的臨床護理
- 人教版四年級上冊《位置與方向》教學設計與反思
- 后葡萄膜炎的臨床護理
- 2025年一級建造師之一建鐵路工程實務模擬題庫及答案下載
- 新質生產力論點
- 深耕新質生產力
- 廣州廣州市天河區(qū)華陽小學-畢業(yè)在即家校共話未來-六下期中家長會【課件】
- 公司事故隱患內部報告獎勵制度
- 大學生創(chuàng)新創(chuàng)業(yè)基礎(創(chuàng)新創(chuàng)業(yè)課程)完整全套教學課件
- DL∕T 5210.6-2019 電力建設施工質量驗收規(guī)程 第6部分:調整試驗
- GB/T 23468-2009墜落防護裝備安全使用規(guī)范
- 影像診斷與手術后符合率統(tǒng)計表
- 2023年北京亦莊國際投資發(fā)展有限公司招聘筆試題庫及答案解析
- ansys電磁場分析經典教程
- 美國數學競賽AMC8講座課件
- 2020年國家義務教育質量測查德育科目模塊一模擬試題含參考答案
- 導管固定-PPT課件
評論
0/150
提交評論