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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

inti=0;……}

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論