




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1第1頁,課件共35頁,創作于2023年2月變量的屬性數據類型:變量所持有的數據的性質(操作屬性)存儲屬性:存儲器類型:寄存器、靜態存儲區、動態存儲區生存期:變量在某一時刻存在——靜態變量與動態變量作用域:變量在某區域內有效——局部變量與全局變量變量定義格式:[存儲類型]數據類型變量表;例:intsum;externinta,b,c;registerinti;staticfloatx,y;第2頁,課件共35頁,創作于2023年2月變量的作用域變量的作用域:變量有效的范圍。C語言中所有的變量都有自己的作用域。變量說明的方式不同,其作用域也不同。C語言的變量,按作用域范圍可分為兩種:局部變量和全局變量。3第3頁,課件共35頁,創作于2023年2月局部變量—內部變量定義:在函數內定義,只在本函數內有效說明:main中定義的變量只在main中有效不同函數中同名變量,占不同內存單元形參屬于局部變量可定義在復合語句中有效的局部變量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效4第4頁,課件共35頁,創作于2023年2月例:不同函數中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=45第5頁,課件共35頁,創作于2023年2月全局變量—外部變量定義:在函數外定義,可為本文件所有函數共用。有效范圍:從定義變量的位置開始到本源文件結束,及有extern聲明的其它源文件。應盡量少使用全局變量,因為:全局變量在程序全部執行過程中占用存儲單元降低了函數的通用性、可靠性,可移植性降低程序清晰性,容易出錯
定義
聲明次數:只能1次可聲明多次位置:所有函數之外函數內或函數外分配內存:分配內存,可初始化不分配內存,不可初始化
外部變量聲明:extern數據類型變量表;外部變量定義與外部變量聲明不同
若外部變量與局部變量同名,則外部變量被屏蔽6第6頁,課件共35頁,創作于2023年2月inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){
inta=8;printf("max=%d",max(a,b));}例:外部變量與局部變量運行結果:max=8例:外部變量定義與聲明externinta,b;intmax(){intz;
z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;外部變量定義及初始化外部變量聲明運行結果:max=137第7頁,課件共35頁,創作于2023年2月intp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍externcharc1,c2;externcharc1,c2;c1,c2的作用范圍擴展后c1,c2的作用范圍擴展后8第8頁,課件共35頁,創作于2023年2月void
main(){voidgx(),gy();
externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){
externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例:用extern擴展外部變量作用域運行結果:1:x=0y=02:x=135y=2463:x=135y=2469第9頁,課件共35頁,創作于2023年2月引用其它文件中的外部變量intglobal;externfloatx;main(){intlocal; . .}externintglobal;staticintnumber;func2(){ . . .}floatx;unc3(){
externintglobal;...}file1.cfile2.cfile3.c10第10頁,課件共35頁,創作于2023年2月變量的存儲類型程序區靜態存儲區動態存儲區全局變量、局部靜態變量形參變量局部動態變量(autoregister)函數調用現場保護和返回地址等內存用戶區11第11頁,課件共35頁,創作于2023年2月動態變量與靜態變量存儲方式靜態存儲:程序運行期間分配固定存儲空間動態存儲:程序運行期間根據需要動態分配存儲空間
生存期靜態變量:從程序開始執行到程序結束動態變量:從包含該變量定義的函數開始執行至函數執行結束
變量的存儲類型
auto-----自動型register-----寄存器型static------靜態型extern-----外部型12第12頁,課件共35頁,創作于2023年2月變量存儲類型靜態動態存儲方式程序整個運行期間函數調用開始至結束生存期編譯時賦初值,只賦一次
每次函數調用時賦初值自動賦初值0或空字符不確定未賦初值靜態存儲區動態區存儲區寄存器局部變量外部變量作用域定義變量的函數或復合語句內本文件其它文件局部變量默認為auto型register型變量個數受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不用于變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別13第13頁,課件共35頁,創作于2023年2月例:文件file1.cinta;main(){…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){
staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:14第14頁,課件共35頁,創作于2023年2月main(){
voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例:局部靜態變量值具有可繼承性運行結果:111main(){
voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運行結果:12315第15頁,課件共35頁,創作于2023年2月例:變量的壽命與可見性#include<stdio.h>inti=1;main(){staticinta;
registerintb=-10;
intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;
other();}other(){staticinta=2;staticintb;
intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0靜態存儲區動態存儲區other:a2other:b0other:c10843315443other:c1067515616第16頁,課件共35頁,創作于2023年2月
#include<stdio.h>
inti=10;
intmain()
{
inti=1;
printf("%d\t",i);
{
inti=2;
pritnf("%d\t",i);
{
externi;
i+=1;
printf("%d\t",i);
}
printf("%d\t",++i);
}
printf("%d\n",++i);
}運行結果為:
1
2
11
3
2
例:
17第17頁,課件共35頁,創作于2023年2月內存動態申請和釋放void*malloc(unsignedintsize)
在動態存儲區分配長度為size的連續空間,并返回指向該空間起始地址的指針。若分配失敗(系統不能提供所需內存),則返回空指針(NULL)。例:int*p=(int*)malloc(sizeof(int)*length);voidfree(void*ptr)
釋放ptr指向的內存空間。ptr是malloc()函數返回的值。例:free(p);18第18頁,課件共35頁,創作于2023年2月內部函數和外部函數函數一旦定義后就可被其它函數調用。但當一個源程序由多個源文件組成時,在一個源文件中定義的函數能否被其它源文件中的函數調用呢?C語言把函數分為兩類:內部函數外部函數19第19頁,課件共35頁,創作于2023年2月內部函數如果在一個源文件中定義的函數只能被本文件中的函數調用,而不能被同一源程序其它文件中的函數調用,這種函數稱為內部函數。定義內部函數的一般形式是:
static類型說明符函數名(形參表)
例如:staticintf(inta,intb)內部函數也稱為靜態函數。但此處靜態static的含義已不是指存儲方式,而是指對函數的調用范圍只局限于本文件。20第20頁,課件共35頁,創作于2023年2月外部函數外部函數在整個源程序中都有效,其定義的一般形式為:
extern類型說明符函數名(形參表)
例如:externintf(inta,intb)如在函數定義中沒有說明extern或static則隱含為extern。在一個源文件的函數中調用其它源文件中定義的外部函數時,應用extern說明被調函數為外部函數。21第21頁,課件共35頁,創作于2023年2月小結可從三個方面對變量分類,即變量的數據類型,變量作用域和變量的存儲類型。在第二章中主要介紹變量的數據類型,本章中介紹了變量的作用域和變量的存儲類型。變量的作用域是指變量在程序中的有效范圍,分為局部變量和全局變量。變量的存儲類型是指變量在內存中的存儲方式,分為靜態存儲和動態存儲,表示了變量的生存期。22第22頁,課件共35頁,創作于2023年2月作用:對源程序編譯之前做一些處理,有助于提高程序的可移植性、靈活性及編譯效率。主要有:宏定義#define文件包含#include條件編譯#if--#else--#endif等格式:“#”開頭占單獨書寫行語句尾不加分號預處理概述23第23頁,課件共35頁,創作于2023年2月宏定義一、不帶參數宏定義一般形式:#define宏名[宏體]功能:用指定標識符(宏名)代替字符序列(宏體)宏體可缺省,表示宏名定義過或取消宏體如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);24第24頁,課件共35頁,創作于2023年2月如if(x==YES)printf(“correct!\n”);
elseif(x==NO)printf(“error!\n”);展開后:if(x==1)printf(“correct!\n”);
elseif(x==0)printf(“error!\n”);宏展開:預編譯時,用宏體替換宏名---不作語法檢查定義位置:任意(一般在函數外面)作用域:從定義命令到文件結束#undef可終止宏名作用域格式:
#undef宏名例#defineYES1
main(){……..}#undefYES#defineYES0
max(){……..}YES原作用域YES新作用域宏定義可嵌套,不能遞歸例#defineMAXMAX+10(
)引號中的內容與宏名相同也不置換例#define
PI
3.14159
printf(“2*PI=%f\n”,PI*2);宏展開:printf(“2*PI=%f\n”,3.14159*2);宏定義中使用必要的括號()例#defineWIDTH80
#define
LENGTHWIDTH+40
var=LENGTH*2;宏展開:var=80+40*2;()()例#define
WIDTH
80#define
LENGTH
WIDTH+40
var=LENGTH*2;宏展開:var=80+40*2;25第25頁,課件共35頁,創作于2023年2月二、帶參數宏定義一般形式:#define宏名(參數表)宏體例#defineS(r)PI*r*r相當于定義了不帶參宏S,代表字符串“(r)PI*r*r”
宏展開:形參用實參換,其它字符保留宏體及各形參外一般應加括號()例#defineS(a,b)a*b………..area=S(3,2);宏展開:area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)
((x)*(x))宏展開:z=((x+y)*(x+y));26第26頁,課件共35頁,創作于2023年2月#defineMAX(x,y)(x)>(y)?(x):(y)
…….main(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開:t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}main(){inta,b,c,d,t;…….t=max(a+b,c+d);………}例:用宏定義和函數實現同樣的功能27第27頁,課件共35頁,創作于2023年2月帶參數宏與函數的區別帶參數宏函數處理過程不分配內存簡單的字符置換分配內存先求實參值,再代入形參處理時間編譯時程序運行時參數類型無類型問題定義實參,形參類型程序長度變長不變運行速度不占運行時間調用和返回占時間28第28頁,課件共35頁,創作于2023年2月文件包含功能:一個源文件可將另一個源文件的內容全部包含進來一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA處理過程:預編譯時,用被包含文件的內容取代該預處理命令,再對“包含”后的文件作一個源文件編譯。<>直接按標準目錄搜索“”
先在當前目錄搜索,再搜索標準目錄,
文件名可指定路徑29第29頁,課件共35頁,創作于2023年2月被包含文件內容源文件(*.c)頭文件(*.h)宏定義數據結構定義函數聲明等文件包含可嵌套#include“file2.c”file1.cAfile3.hC#include“file3.h”file2.c
Bfile1.cAfile3.hfile2.c調用庫函數加強類型檢查提高程序可讀性30第30頁,課件共35頁,創作于2023年2月文件包含舉例/*powers.h*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省德州市躍華中學2024-2025學年高三年級5月聯考試題含解析
- 西藏拉薩市那曲二中2024-2025學年高三下5月第一次階段達標檢測試題英語試題含解析
- 江蘇省南京市鼓樓區鳳凰花園城小學2025年三年級數學第二學期期末教學質量檢測試題含解析
- 延邊市重點中學2025年初三下學期摸底數學試題含解析
- 江西省南昌市心遠中學2025年初三3月統一練習(一)英語試題含答案
- 重慶二手房交易合同示范文本
- 山東省濰坊市臨朐縣2025屆初三下學期模擬卷(四)物理試題含解析
- 山東省煙臺市第二中學2024-2025學年高三下學期周考英語試題(重點)試題含解析
- 河南省信陽市2024-2025學年高二下學期期中考試歷史試題(含答案)
- 第一單元第二課《美術家族成員多》教學設計-魯教版五四制六年級美術上冊
- 碎石外包合同協議
- 2025年第三屆天揚杯建筑業財稅知識競賽題庫附答案(1001-1536題)
- 2025科技輔導員培訓
- 新疆維吾爾自治區2024年普通高校招生普通類國家及地方專項、南疆單列、對口援疆計劃 本科一批次投檔情況 (理工)
- 智研咨詢發布:2025年紙漿模塑餐飲具行業市場規模及主要企業市占率分析報告
- 2025年CCAA《管理體系認證基礎》考前必練題庫500題(含真題、重點題)
- 中西融合餐廳的經營管理與團隊建設
- 2025年智慧工程考試試題及答案
- 大宗商品供應鏈管理規范
- 2025年國家糧食和物資儲備局垂直管理系事業單位招聘筆試參考題庫附帶答案詳解
- DB32-T 4281-2022 江蘇省建筑工程施工現場專業人員配備標準
評論
0/150
提交評論