第七章作用域和存儲屬性_第1頁
第七章作用域和存儲屬性_第2頁
第七章作用域和存儲屬性_第3頁
第七章作用域和存儲屬性_第4頁
第七章作用域和存儲屬性_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章作用域和存儲屬性7.1C程序的結(jié)構(gòu)7.2作用域和作用域規(guī)則7.3存儲屬性和生存期7.4變量的初始化模塊是指為完成特定的任務(wù)而建立的相對獨立的程序單元。具體地說,是一段連續(xù)的,相鄰的程序序列。它被邊界元素“{}”限制在一定的范圍內(nèi),并有一個標(biāo)識符從整體上代表這些程序語句序列。這個標(biāo)識符就是此模塊的名字,它可以被其它模塊中的語句所引用。根據(jù)以上概念,可以被叫作模塊的有:模塊模塊名邊界元素函數(shù)函數(shù)名{}類類名{}一段源程序源文件名

同一個源文件7.1C程序的結(jié)構(gòu)7.1.1模塊的概念:圖7-1-1顯示了一個C語言程序結(jié)構(gòu),它由多個源程序模塊(源文件)組成,一個源程序模塊由一個或多個函數(shù)模塊組成,程序從主函數(shù)模塊開始執(zhí)行,主函數(shù)模塊調(diào)用其他函數(shù)模塊,其他函數(shù)模塊之間也可以相互調(diào)用,所有調(diào)用結(jié)束以后最終程序的執(zhí)行流程要返回主函數(shù)模塊。所以,一個可執(zhí)行的C程序必須在某個源程序文件中,有且僅有一個主函數(shù)7.1C程序的結(jié)構(gòu)7.1.1模塊的概念(續(xù)):圖7-1-1C語言的程序結(jié)構(gòu)…C程序(工程)源程序文件1源程序文件2源程序文件n預(yù)處理命令數(shù)據(jù)聲明函數(shù)n函數(shù)1…模塊化的目的是為了隱藏信息。對一個模塊而言,若它能被程序中的其它模塊調(diào)用,則我們說:對調(diào)用它的模塊而言,該模塊可見。若模塊內(nèi)部的某些信息(函數(shù),變量等)不被隱藏,則這部分就可被其它程序所引用。7.1C程序的結(jié)構(gòu)7.1.2模塊與信息隱藏:作用域規(guī)則,訪問控制及連接屬性可將一個模塊的信息隱藏或開放,從而在C程序的模塊之間實現(xiàn)數(shù)據(jù)共享。作用域指的是程序正文中有效的那部分區(qū)域。具體而言,是程序正文中對象可以被使用的那部分區(qū)域。7.2作用域和作用域規(guī)則7.2.1塊作用域和局部變量:具有塊作用域的對象是定義在一對{}之內(nèi)的。塊作用域的范圍從程序中對象定義處到塊結(jié)束處的“}”止。具有塊作用域的變量叫局部變量。{17intk=stuNo[i]-‘0’;

number=10*number+k;i++;20}在程序7_1.cpp的第17行我們定義了一個局部變量k,其起作用的范圍到程序第20行結(jié)束。所以,在第20行以后如果引用變量k,編譯系統(tǒng)將會報錯。也就是說,變量k僅在while循環(huán)內(nèi)有效,超過這個范圍,就不能使用此變量了。作用域指的是程序正文中有效的那部分區(qū)域。具體而言,是程序正文中對象可以被使用的那部分區(qū)域。7.2作用域和作用域規(guī)則7.2.2函數(shù)作用域和形參變量:對象的函數(shù)作用域是指對象在定義它的整個函數(shù)的范圍內(nèi)都有效。C語言中,函數(shù)的形參變量具有函數(shù)作用域。doubleaverage(intscore[],intn){//average函數(shù)開始

inti=0;……}

//average函數(shù)結(jié)束在程序7_2.cpp中,形參變量score和n的作用域為average函數(shù)開始處到average函數(shù)結(jié)束處。另外一個具有函數(shù)作用域的是gotoXXX;語句中的語句標(biāo)號XXX。即:該標(biāo)號可以出現(xiàn)在一個函數(shù)體內(nèi)的任何一條語句前。voidfun(){ gotoW1;

… if(b>0){W1:…; gotoW2; }

W2:…;}作用域指的是程序正文中有效的那部分區(qū)域。具體而言,是程序正文中對象可以被使用的那部分區(qū)域。7.2作用域和作用域規(guī)則7.2.3文件作用域和全局變量:對象的文件作用域是指從對象的定義處到整個源文件模塊結(jié)束處。全局變量是指定義在本源文件中所有函數(shù)之前的變量。其作用域從定義位置開始,直到程序結(jié)束。C語言中,具有文件作用域的對象有全局變量和函數(shù)名(函數(shù)名就代表函數(shù)對象)intsum=0;//定義全局變量sum存放成績總和doubleaverage(intscore[],intn){……}intmain(){……}在7_3.cpp中定義了全局變量sum,其作用域為整個文件,因此,本文件的所有函數(shù)均可使用此變量。7.2作用域和作用域規(guī)則intp=1,q=5;floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;……}a,b,c有效的范圍x,y,i,j有效的范圍m,n有效的范圍的作用范圍p,qc1,c2的作用范圍小結(jié)7.2作用域和作用域規(guī)則對全局變量的使用,需要做如下說明:①由于全局變量可以被同一源文件中的所有函數(shù)模塊使用,因此全局變量提供了函數(shù)間除“實參—形參”相結(jié)合傳送數(shù)據(jù)之外的另一種數(shù)據(jù)傳送的渠道。實際應(yīng)用中,函數(shù)調(diào)用時通過return語句只能返回一個值,而通過全局變量可以共享多個數(shù)據(jù)。②由于全局變量在所有函數(shù)之前定義,同源文件中的所有函數(shù)都可以直接引用,不需另外說明。③使用全局變量時,如在一個函數(shù)中改變了全局變量的值,將影響到同源文件中的其他函數(shù)。實際應(yīng)用中,有時在一個函數(shù)中不經(jīng)意地改變?nèi)肿兞康闹?,將使整個程序的運行出現(xiàn)錯誤。④全局變量使用過多,將降低程序的可讀性,不便于分析每個全局變量的瞬時變化情況。另外全局變量的使用增強了函數(shù)之間的數(shù)據(jù)聯(lián)系,但同時又使得函數(shù)過分依賴這些全局變量,降低了函數(shù)的獨立性,因此從結(jié)構(gòu)化程序設(shè)計的角度來講,要限制全局變量的使用。例7.3作用域指的是程序正文中有效的那部分區(qū)域。具體而言,是程序正文中對象可以被使用的那部分區(qū)域。7.2作用域和作用域規(guī)則7.2.4作用域規(guī)則:在一個源文件模塊中,塊作用域、函數(shù)作用域和文件作用域之間的包含關(guān)系如圖7-2-1所示。圖7-2-1作用域包含關(guān)系文件作用域函數(shù)作用域塊作用域塊作用域函數(shù)作用域文件作用域C語言的作用域需遵循以下規(guī)則:①內(nèi)層作用域不能延伸到外層。②在同一源文件中,若內(nèi)層和外層中聲明了同名標(biāo)識符,則內(nèi)層的標(biāo)識符屏蔽外層的同名標(biāo)識符。③在同一源文件中,如果內(nèi)層想引用外層具有文件作用域的同名標(biāo)識符(如同名的全局變量),在VisualStudio2008編譯環(huán)境下使用全局作用域運算符::。④如果要在一個源文件模塊中引用另一個源文件模塊中定義的全局變量,可使用關(guān)鍵字extern在使用它的源文件中進行引用性聲明。參見教材P201例7.4例7.5局部和全局是從變量的作用范圍(空間上)劃分的。局部變量與全局變量小結(jié):局部變量在一個塊內(nèi)定義的變量叫做局部變量。局部變量只在定義它的塊范圍內(nèi)有效,即程序只有在執(zhí)行該塊時才能訪問這些變量,在執(zhí)行其它函數(shù)時不能訪問。#include“stdio.h”voidmain(){intf;intn=5;f=Fibo(n);printf(“f=%ld\n”,f);}n是main函數(shù)中的局部變量f也是main函數(shù)中的局部變量局部變量的有關(guān)說明1.主函數(shù)之中定義的變量同樣屬于局部變量。其它函數(shù)不能訪問主函數(shù)中的局部變量,主函數(shù)也不能訪問其它函數(shù)中的局部變量。說明:2.不同函數(shù)中可以定義相同名字的變量。由于它們是各自函數(shù)內(nèi)部的局部變量,所以互不影響。3.形參變量也是局部變量。4.在函數(shù)內(nèi)部,還可以在復(fù)合語句(花括號括起的一組語句)內(nèi)定義變量,這些變量只在該復(fù)合語句內(nèi)起作用。全局變量全局變量一個源程序文件中,在所有函數(shù)外定義的變量叫做全局變量。全局變量的作用范圍從定義的位置開始到該源程序文件結(jié)束。也就是說,在這個范圍內(nèi),所有的函數(shù)都可以訪問它(當(dāng)然就可以改變它的值)。

全局變量的作用:由于在全局變量的作用范圍內(nèi),所有的函數(shù)都可以訪問它,所以利用全局變量就可以在函數(shù)之間增加傳遞信息的通道。包括調(diào)用函數(shù)時傳遞信息進去,以及函數(shù)返回后得到多個返回值。在C語言程序中使用的每個變量都具有兩個屬性:數(shù)據(jù)類型和存儲類型。數(shù)據(jù)類型確定了變量在內(nèi)存中分配的存儲單元的多少,而存儲類型決定了變量所分配的存儲區(qū)的類型,而存儲區(qū)的類型又決定了變量的生存期。所以,變量的存儲類型決定了變量的生存期。由此可見,變量的存儲類型是變量在時間方面的屬性。7.3存儲屬性和生存期7.3.1變量的存儲屬性:在程序運行期間,該程序所占據(jù)的內(nèi)存空間叫用戶區(qū)。用戶區(qū)又劃分為:

(內(nèi)存)用戶區(qū) 程序代碼區(qū) 全局變量 靜態(tài)數(shù)據(jù)存放區(qū) 靜態(tài)局部變量 形參變量 動態(tài)數(shù)據(jù)存放區(qū) 自動變量

現(xiàn)場斷點,返回地址等7.3存儲屬性和生存期7.3.1變量的存儲屬性(續(xù)):

(內(nèi)存)用戶區(qū) 程序代碼區(qū) 全局變量 靜態(tài)數(shù)據(jù)存放區(qū) 靜態(tài)局部變量 形參變量 動態(tài)數(shù)據(jù)存放區(qū) 自動變量

現(xiàn)場斷點,返回地址等動態(tài)變量存放在動態(tài)數(shù)據(jù)存放區(qū),動態(tài)數(shù)據(jù)存放區(qū)是由系統(tǒng)在程序運行期間根據(jù)需要動態(tài)分配的,需要時分配,不需要時釋放。靜態(tài)變量存放在靜態(tài)數(shù)據(jù)存放區(qū),靜態(tài)數(shù)據(jù)存放區(qū)一經(jīng)分配,便要到程序運行結(jié)束后才會被釋放。7.3存儲屬性和生存期7.3.2自動變量:C語言中提供了4個關(guān)鍵字用于定義變量的存儲類型,他們是:auto、extern、static和register。分別對應(yīng)于四種存儲類型:①自動型;②外部型;③靜態(tài)型;④寄存器型。根據(jù)變量的存儲類型,將變量分為四種類型的變量:①自動變量(auto);②外部變量(extern);③靜態(tài)變量(static);④寄存器變量(register)。自動變量的定義使用關(guān)鍵字auto。關(guān)鍵字auto可省略。例(auto)inta;關(guān)鍵字auto一般可以缺省,本章以前函數(shù)內(nèi)所定義的變量都是自動變量。自動變量存放在內(nèi)存的動態(tài)數(shù)據(jù)區(qū),其作用域范圍內(nèi)的代碼一旦執(zhí)行完,這些變量的存儲空間就釋放了。由于自動變量是內(nèi)部變量,其作用域僅局限于它定義所在的模塊內(nèi)。7.3存儲屬性和生存期7.3.3外部變量:外部變量的定義使用關(guān)鍵字extern。例externinta;外部變量定義在所有函數(shù)之外,其作用域從它定義處到源文件結(jié)束處,具有文件作用域。關(guān)鍵字extern一般可以缺省。外部變量存放在內(nèi)存的靜態(tài)數(shù)據(jù)區(qū)。在一個源文件中,如外部變量要在其定義之前使用,用關(guān)鍵字extern在使用它的函數(shù)中進行引用性聲明。顯然,全局變量就是外部變量,二者的區(qū)別僅在于劃分變量類別的角度不一樣。實際上,全局變量和外部變量在使用上基本沒有差別。所以,我們并未對二者進行嚴(yán)格的區(qū)分。例7.67.3存儲屬性和生存期7.3.4靜態(tài)變量:靜態(tài)變量的定義使用關(guān)鍵字static。例staticinta;根據(jù)變量的作用域的不同,靜態(tài)變量可分為靜態(tài)局部變量和靜態(tài)全局變量。例7.7函數(shù)內(nèi)定義的靜態(tài)變量為靜態(tài)局部變量。靜態(tài)局部變量的作用域同自動變量,兩者區(qū)別在于生存期的不同。在整個程序的運行過程中,靜態(tài)局部變量一直存在。靜態(tài)局部變量能保留上次調(diào)用時的值。靜態(tài)局部變量在編譯時賦初值,即只賦初值1次。如果程序中沒有給靜態(tài)局部變量顯示賦初值,則編譯時,系統(tǒng)自動賦初值0(對數(shù)值型變量)或空字符(字符型變量)如果變量初始化后,只被引用而不需要改變其值,則該變量定義為靜態(tài)局部變量比較好。例7.87.3存儲屬性和生存期7.3.4靜態(tài)變量(續(xù)):靜態(tài)變量的定義使用關(guān)鍵字static。例staticinta;根據(jù)變量的作用域的不同,靜態(tài)變量可分為靜態(tài)局部變量和靜態(tài)全局變量。例7.9全局變量和靜態(tài)全局變量的存儲方式均為靜態(tài)存儲方式,兩者的區(qū)別在于作用域的不同。靜態(tài)全局變量作用域為其所在的源程序文件,即只能被該源程序中的函數(shù)使用;全局變量可以通過關(guān)鍵字extern將作用域擴展到其他源程序文件。7.3存儲屬性和生存期7.3.5寄存器變量:寄存器變量的定義使用關(guān)鍵字register。例registerinti,j,k;寄存器變量存放在寄存器中,主要是一些使用頻繁的變量。例7.10只有內(nèi)部變量和形參變量可以定義為寄存器變量。函數(shù)調(diào)用時為定義為寄存器變量的形參變量分配寄存器,調(diào)用結(jié)束后就釋放所分配的寄存器。寄存器變量是內(nèi)部變量,其作用域為塊作用域或函數(shù)作用域,其生命期為函數(shù)的每次調(diào)用。文件作用域中定義的對象(全局變量)具有靜態(tài)生存期。即在程序執(zhí)行過程中它們占據(jù)固定的存儲單元一直到程序結(jié)束。函數(shù)作用域和塊作用域中定義的對象(局部變量)具有動態(tài)生存期。即在程序執(zhí)行過程中它們所占據(jù)的存儲單元是動態(tài)地進行分配和釋放。函數(shù)作用域和塊作用域中定義的對象要具有靜態(tài)生存期必需在其定義時加關(guān)鍵字static(聲明為靜態(tài)局部變量)作用域和生存期的小結(jié)static關(guān)鍵字用在局部變量定義時,是將該動態(tài)局部變量變?yōu)殪o態(tài)局部變量;static關(guān)鍵字用在全局變量定義時,是將該全局變量的有效范圍限定在定義該全局變量的源文件中;static關(guān)鍵字用在函數(shù)定義時,是將該函數(shù)的有效范圍限定在定義該函數(shù)的源文件中;extern關(guān)鍵字可對先使用后定義的全局變量在第一次使用該全局變量處進行‘引用聲明’。(在同一文件中擴展外部變量的作用域)extern關(guān)鍵字可對在別的源文件中定義的全局變量作‘引用聲

溫馨提示

  • 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

提交評論