




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、使用C語言開發簡單應用第十三章 變量作用域和生存期上一章內容回顧 函數定義 函數聲明和函數原型 函數調用 函數的嵌套調用 函數的遞歸調用 文件包含 內部函數和外部函數 多文件程序編制 使用函數時應注意的問題2/28本章學習目標 理解變量的作用域 局部變量 全局變量 理解變量的生存期 靜態存儲方式 動態存儲方式 理解變量的存儲類別 自動的(auto) 靜態的(static) 寄存器(register) 外部的(extern) 理解靜態局部變量3/28內容進度 變量的作用域 局部變量 全局變量 變量的生存期 存儲方式 靜態存儲方式 動態存儲方式 存儲類別 自動的(auto) 靜態的(static)
2、 寄存器(register) 外部的(extern)4/28局部變量 定義: 在函數內或語句塊內定義,只在本函數或本語句塊內有效。 說明: 不同函數或語句塊可以定義同名的局部變量,分配不同的存儲單元,互不干擾,不會發生混淆 函數的形參是局部變量,只能在函數內使用5/28局部變量 舉例:6/28#include void main() int i=3;int j=5;int k=0; /函數內局部變量 k=i+j; int k=10; /語句塊內局部變量 printf(%dn,k); printf(%dn,k);float f1(int a) int b,c; .char f2(int x,in
3、t y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效內容進度 變量的作用域 局部變量 全局變量 變量的生存期 存儲方式 靜態存儲方式 動態存儲方式 存儲類別 自動的(auto) 靜態的(static) 寄存器(register) 外部的(extern)7/28全局變量 定義: 在所有函數外部定義的變量,有效范圍從定義的位置到本文件結束。 舉例: 說明: 若全局變量與局部變量同名,則全局變量將被屏蔽。 當一個程序的許多函數都是使用一個全局變量時,全局變量為編程提供了方便。 但是應該避免不必要地使用全局變量,因為: 全局變量在程序的執行期間都占用
4、內存,如果定義很多全局變量,則系統運行中需要消耗較多的內存 會降低函數的通用性、可靠性、可移植性 會降低程序清晰性,容易出錯8/28int p=1;float f1(int a) p=10; .char c=A;char f2(int x,int y) c1=B; main() p=20;c=C; .p有效c有效全局變量 應用舉例1:9/28#include /*全局變量*/int a=5;int b=10; void fun(void) int c; c=a; a=b; b=c;void main() printf(a=%d,b=%dn,a,b); fun(); printf(a=%d,b=
5、%dn,a,b);全局變量 應用舉例2:10/28#include int a=3;int b=5;int max(int a, int b) int c; c=ab?a:b; return(c);void main() int a=8; printf(max=%dn,max(a,b);全局變量 應用舉例3:11/28#include int i;void main() void prt();for(i=0;i5;i+)prt();void prt() for(i=0;i5;i+)printf(%c,*);printf(n);內容進度 變量的作用域 局部變量 全局變量 變量的生存期 存儲方式
6、靜態存儲方式 動態存儲方式 存儲類別 自動的(auto) 靜態的(static) 寄存器(register) 外部的(extern)12/28變量的存儲方式 靜態存儲方式: 在程序運行期間分配固定的存儲空間的方式。 靜態存儲區: 全局變量(存儲在靜態存儲區,程序執行時分配存儲空間) 靜態局部變量(static)(保留上一次調用結束后的變量值) 動態存儲方式: 在程序運行期間根據需要動態地分配存儲空間的方式。 動態存儲區: 函數形參 函數調用時的現場保護和返回地址 非靜態局部變量13/28內容進度 變量的作用域 局部變量 全局變量 變量的生存期 存儲方式 靜態存儲方式 動態存儲方式 存儲類別 自
7、動的(auto) 靜態的(static) 寄存器(register) 外部的(extern)14/28變量的存儲類別 存儲類別: 自動的(auto) 靜態的(static) 寄存器(register) 外部的(extern) 變量定義: 一般形式:存儲類別 數據類型 變量表; 舉例: int sum; auto int a; register int i; static float x; extern char ch;15/28auto變量 說明: 動態存儲方式,存儲在動態存儲區 變量定義中存儲類別省略時,默認為auto型 auto型變量在函數/語句塊被調用時分配內存,每次調用都重新分配,重新
8、賦初值,調用結束則釋放空間。 auto型變量如果不賦初值,則其值是一個不確定的值。16/28靜態局部變量 舉例: 說明: 靜態存儲方式,在靜態存儲區分配單元,在程序運行期間都不釋放。 靜態局部變量具有可繼承性,在整個程序運行期間只賦一次初值,以后調用不在重新賦初值,而只是保留上次調用后的值。 在定義時如果沒有賦初值,則自動賦初值為該類型的零值。 靜態局部變量具有全局的壽命和局部的可見性,作用域仍然是該函數/語句塊內。17/28#include void main() void Adda(void);int i=0;for( i=0; i3; i+ )Adda();void Adda(void)
9、 static int x=0; int y=1; int z=0;x+; y+; z=x+y;printf(x=%d,y=%d,z=%dn,x,y,z);靜態局部變量 應用舉例:輸出15的階乘。18/28#include int fac(int n)static int f=1;f=f*n;return f;void main()int i;for(i=1; i6; i+)printf(%d!=%dn,i,fac(i);register變量 說明: 只有非靜態局部變量和形參可定義為register變量,全局變量和靜態局部變量不能定義為register變量。 一個系統中的寄存器數目是有限的,不
10、能定義任意多個register變量。 在實踐中很少使用register變量,因為目前很多編譯器都具有優化選項,會自動把一些頻繁使用的變量放在寄存器中以提高效率。19/28用extern聲明外部變量 在一個文件內聲明外部變量 在多個文件中聲明外部變量20/28#include void Demo(void)extern int x,y;int a=10,b=10;x=a-b;y=a+b;printf(DEMO:%d,%dn,x,y);void main()int a=9, b=5;extern int x,y;x=a+b;y=a-b;printf(MAIN:%d,%dn,x,y);Demo();
11、printf(MAIN:%d,%dn,x,y);int x,y;#include extern int x,y;void Demo();void main()int a=9,b=5;x=a+b;y=a-b;printf(MAIN:%d,%dn,x,y);Demo();printf(MAIN:%d,%dn,x,y); main.cint x,y;void Demo()int a=10,b=10;x=a-b;y=a+b;printf(DEMO:%d,%dn,x,y);fun.c用static修飾全局變量 作用: 使全局變量只限于本文件使用,其他文件不能引用,可以防止其他程序無意中錯誤地引用了全局變
12、量。 舉例:21/28extern int a;void main()file1.cstatic int a;void fun(int x)file2.c應用舉例22/28#include int i=1;void other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(-OTHER-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); b=a;void main() static int a; register int b=-10; int c=0; printf(
13、-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); c=c+8; other(); printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); i=i+10; other();應用舉例 分析:23/28-Main-i:1 a:0 b:-10 c:0 -Other-i:33 a:4 b:0 c:15 -Main-i:33 a:0 b:-10 c:8-Other-i:75 a:6 b:4 c:15全局i1main: a0b:-10registermain:c0靜態存儲區動態存儲區other: a2othe
14、r: b0other: c10843315443other: c10675156本章內容總結 對變量的定義,有兩種屬性:數據類型和存儲類別,例如: static int x;(定義靜態局部變量或定義限于本文件使用的全局變量) auto int y;(定義自動變量,即局部變量) regiter int a;(定義寄存器變量,函數內部定義) extern int b;(聲明已經定義的全局變量)24/28本章內容總結 從作用域角度分為:局部變量和全局變量。 局部變量: 自動變量:存儲在動態存儲區中,離開函數,值就消失; 靜態局部變量:存儲在靜態存儲區中,離開函數,值仍保留; 寄存器變量:存儲在寄存器
15、中,離開函數,值就消失; 形參:被看做局部變量,可以定義為自動變量或寄存器變量。 全局變量: 使用extern擴展作用域 使用static限制作用域(靜態全局變量:本文件的函數調用,在靜態存儲區,而且受保護)25/28本章內容總結 從變量的生存期區分:動態存儲方式和靜態存儲方式。 靜態存儲方式是在程序整個運行期間都存在,而動態存儲方式是在調用函數時臨時分配單元。 動態存儲: 自動變量 寄存器變量 形參 靜態存儲: 靜態局部變量(此函數體內有效,靜態存儲區.受保護) 全局變量26/28本章內容總結27/28int a;main( ) . . f2; . f1; .f1( ) auto int b; f2; .f2( ) static int c; c作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期: 小結局部變量局部變量全局變量全局變量存儲類別存儲類別autoregiste
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 戀愛合同協議書電視劇
- 環球旅游購物節泰國站項目建議書
- 中國阻燃橡膠發泡板行業市場前景預測及投資價值評估分析報告
- 燒烤服務合同協議書模板
- 健康搭配飲食課件
- 雙高計劃面試題及答案
- 2025秋五年級語文上冊統編版-【語文園地四】交互課件
- 制石沙加工合同協議書
- 自建套房買賣合同協議書
- 肉食品加工融資投資立項項目可行性研究報告(2025咨詢)
- 公務用車租賃服務采購項目比選文件
- 香港認可的大陸工作證明范本
- 新建混凝土路面道路工程施工工程投標書(技術方案)
- 旁站記錄新表(腳手架拆除)
- 低壓柜開關更換施工方案
- 織金新型能源化工基地污水處理廠及配套管網工程-茶店污水處理廠環評報告
- 陜西省2023年中考英語真題(附答案)
- 智慧能源(電力)大數據平臺建設方案
- 《兩個神秘的小鞋匠》課件
- 河南省平頂山市2022-2023學年八年級下學期期末物理試卷(含答案)
- 湖北省旅游PPT簡介湖北省幻燈片模板
評論
0/150
提交評論