AVR單片機C語言編程--課件

單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,ppt課件,*,單擊此處編輯母版標題樣式,*,,,,,,,,,,,,,,,,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,ppt課件,*,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,機電系統(tǒng)控制電路設計,*,,,,,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,機電系統(tǒng)控制電路設計,*,機電系統(tǒng)控制電路設計,張志安,南京理工大學,1,ppt課件,機電系統(tǒng)控制電路設計張志安南京理工大學1ppt課件,1 C,語言基礎,2,數據類型、運算符和表達式,3,程序控制語句,4,函數及其調用,5,編譯預處理,6,數組及指針,AVR,單片機,C,語言編程基礎,2,ppt課件,1 C語言基礎AVR單片機C語言編程基礎2ppt課件,1 C,語言基礎,例子,1,,3,ppt課件,1 C語言基礎例子 1 3ppt課件,例子,2,1 C,語言基礎,4,ppt課件,例子 2 1 C語言基礎4ppt課件,1 C,語言基礎,例子,3,,5,ppt課件,1 C語言基礎例子 3 5ppt課件,1 C,語言基礎,/*,給定半徑,求圓的面積*,/,#define PI 3.14159 /*,編譯預處理,——,宏替換*,/,#include
7,ppt課件,關于編譯預處理(宏定義)1 C語言基礎#define PI,1 C,語言基礎,#include ,stdio.h——“,頭文件”(標準前導文件),C,語言是一種“裝配式”語言,許多常規(guī)的工作如輸入、輸出、數學函數等,往往事先由人做成各種“程序模塊”,(,庫函數,),,存放在各種所謂“頭文件”(,.h,)中使用時只需進行以下處理,—,#include “,頭文件名” 或,#include <,頭文件名,>,在程序的執(zhí)行部分調用該庫函數:函數名(參數),文件包含的作用,就是根據需要把相應的某個“頭文件”的內容在編譯時先整體嵌入所編的程序中用戶也可以將自己設計的程序模塊等做成“頭文件”,供其他程序“包含”關于編譯預處理(文件包含),8,ppt課件,1 C語言基礎#include 關于編譯,1 C,語言基礎,標識符被,#define,命令定義過,#ifdef,標識符,,程序段,1,#else,,程序段,2,#endif,,關于編譯預處理(條件編譯),標識符未被,#define,命令定義過,#ifndef,標識符,,程序段,1,#else,,程序段,2,#endif,,#if,表達式,----,表達式真執(zhí)行程序段,1,,假執(zhí)行程序段,2,,程序段,1,#else,,程序段,2,#endif,,9,ppt課件,1 C語言基礎標識符被#define 命令定義過關于編譯預處,1 C,語言基礎,,關于主函數,,,main( ) {……},C,語言是一種函數式語言,它的一個函數實際上就是一個功能模塊,——C,程序的基本組成是函數。
一個,C,程序是由一個固定名稱為,main,的主函數和若干個其他函數(可沒有)組成一個,C,程序必須有一個、也只能有一個主函數主函數在程序中的位置可以任意,但程序執(zhí)行時總是從主函數開始,在主函數內結束主函數可以調用其他各種函數(包括用戶自己編寫的),但其他函數不能調用主函數10,ppt課件,1 C語言基礎 關于主函數 mai,主函數的一般形式:,main( ) {,,說明部分程序段(定義數據類型),執(zhí)行部分程序段(給出操作指令),},說明部分(簡單程序可能沒有此部分),:,,float r,s;,/*,定義變量,r,、,s,類型為單精度實型*,/,int a,b;,/*,定義變量,a,、,b,類型為整型*,/,執(zhí)行部份:輸入、賦值、計算、控制、輸出等,:,,r=1.0;,/*,變量,r,賦初值*,/,s=PI,*,pow(r,2);,/*,計算圓面積,s*/,printf(",半徑,R=%f,時,面積,S=%f \n",r,s);,/*,輸出結果*,/,1 C,語言基礎,11,ppt課件,主函數的一般形式:main( ) {說明部分(簡單程序可能沒,其他函數,標準庫函數,——,只能調用 。
使用方法:,⒈先“包含”,即將該函數所在頭文件包含在程序中⒉后調用調用方式:函數名(參數),例:,#include ,#include ,main( ),,{,,……,,s=PI,*,pow(r,2);,,……,,,printf(“,半徑,R=%f,時,面積,S=%f\n”,r,s);,},說明:,pow(x,y),求,x,y,,(,math.h,中的標準數學函數),,printf(……); (stdio.h,中的標準輸出函數,),,,1 C,語言基礎,12,ppt課件,其他函數標準庫函數——只能調用 使用方法: 例: #in,其他函數,自編(定義)函數:,⒈ 先定義(規(guī)定函數類型、函數名和函數功能),⒉ 后調用(使用所定義的函數實現(xiàn)其功能),,定義函數:,函數類型 函數名(形式參數),,{,(函數體),},,調用函數:,函數名(參數),求三個數的平均值,float average ( float x, float y, float z) /*,定義函數,average( )*/,{,float aver;,aver=(x+y+z)/3;,return(aver);,},main( ) /*,主函數*,/,{ float a,b,c,ave;,a=3.5;b =4.6;c =7.9;,ave=average(a,b,c); /*,調用自定義函數,average( )*/ printf(,",average=%f,",,ave);,},1 C,語言基礎,13,ppt課件,其他函數自編(定義)函數: 求三個數的平均值1 C語言基礎1,關于語句:,,①數據類型定義語句,語句形式,,變量類型關鍵字,,變量名;,,float,,r,s;,,定義,r,、,s,為單精度實型變量,,,int,,r,s;,,定義,r,、,s,為整型變量,【,注意,】,在,C,語言程序中,,,所有變量都要先定義后使用,否則就會出現(xiàn)編譯錯誤提示,如:,Error:,,Undefined symbol ‘ a’ in function main,,Let’s try,…,變量類型關鍵字,字符型(描述文字性的數據),char,,數值型,:,,■,整型(在機內是準確表示的,),,,int,,■,實型(在機內一般是近似表示的,),,float,(,有效數字,6,位),,double,(,有效數字,16,位,),變量名,,C,語言,標識符,(變量名、符號常量名、函數名等)命名:,■組成:字母、數字、下劃線,■開頭:字母、下劃線,■長度:≤,32,字符,【,注意,】,大小寫為不同字符(變量名一般小寫,符號常,量 名一般大寫),還要注意不得與,關鍵字,同名。
1 C,語言基礎,14,ppt課件,關于語句:①數據類型定義語句語句形式 變量類型,關于語句:,②賦值語句,作用:使變量獲得具體的運算值語句形式,,變量名,=,表達式,(常量、變量、函數、算式及其混合);,,r,=,1.0,;,,/*,變量,r,賦初值*,/,,s,=,PI*pow(r,2),;,,/*,計算圓面積,s*/,變量賦初值亦可在數據類型定義時進行:,,float r =1.0, s;,,把變量聲明語句與賦值結合在一起的語句,術語上稱為 “初始化語句”1 C,語言基礎,15,ppt課件,關于語句: ②賦值語句作用:使變量獲得具體的運算值1 C,關于語句:,,③輸出語句,作用:將運算結果送到顯示器屏幕顯示出來,語句形式,printf,(,……,),;,,printf,(,",半徑,R=%f,時,面積,S=%f\n",r,s,);,,printf,(,“Hello,everyone!”,);,【,注意,】C,語言本身沒有輸入、輸出語句,其功能要借用有關函數來實現(xiàn)f —,格式字符串,,\n —,控制字符(轉義字符),\n,表示回車換行,,引號中的其他部分照原樣輸出,1 C,語言基礎,16,ppt課件,關于語句: ③輸出語句作用:將運算結果送到顯示器屏幕顯示出,關于格式字符串,表示該處將用,printf,語句引號外對應表達式的值替換后輸出,例:若,r =1,s=3.14,,printf,(“,半徑,R=%f,時,面積,S=%f\n”,r,s);,,輸出結果:,半徑,R=1,時,面積,S=3.140000,常用格式字符串:,字符型:,%c,,單字符,,%s,,字符串,數值型:,%d,,整數(十進制),,%f,,實數(小數形式,默認為,6,位小數),例一,,int x = 5;,f loat y =3;,printf ("a=%d,b=%f,c=%s",x,y, "abcdefg");,輸出結果:,,a=5,b=3.000000,c=abcdefg,例二,,int x = 5;,f loat y =3;,printf ("a=%d,b=%f,c=%s",x+2,y*3, "123defg");,輸出結果:,,a=7,b=9.000000,c=123defg,1 C,語言基礎,17,ppt課件,關于格式字符串表示該處將用printf語句引號外對應表達式的,C,語言程序的基本結構,一個,C,程序是由一個固定名稱為,main,的主函數和若干個其他函數(可缺?。┙M成。
其,基本結構,一般形式如右圖所示編譯預處理部分,(,可選,),main( ),{,說明部分,/*,變量定義等*,/,執(zhí)行部分,/*,輸入,/,輸出,/,計算*,/,,},,其他函數,(,可選,位置任意,),1 C,語言基礎,返回,18,ppt課件,C語言程序的基本結構 一個C程序是由一個固定名稱為main的,2,數據類型、運算符和表達式,19,ppt課件,2 數據類型、運算符和表達式19ppt課件,2,數據類型、運算符和表達式,20,ppt課件,2 數據類型、運算符和表達式20ppt課件,2,數據類型、運算符和表達式,,可知對不同數據類型占用的存儲空間,:,,char
例,】 printf(“%d”, !3+5),結果為,5,printf(“%d”, !0+5),結果為,6,注意:,!,優(yōu)先于關系運算符,與,++,、,--,同級例一,】,,main( ),{,int a=1,b=2,m=2,n=2;,(m=a>b),printf("%d\n",n);,},運行結果:,n=2,【,例二,】,main( ),{,int a=1,b=2,m=2,n=2;,(m=b>a),printf("%d\n",n);,},運行結果:,n=3,原因:,在,&&,和,||,的左邊如果能判斷出結果,則右邊不再作運算結論:,在邏輯表達式的求解中,并不是所有的邏輯運算符都會被執(zhí)行只是在必須執(zhí)行下一個邏輯運算符才能求出表達式的解時,才執(zhí)行該運算符27,ppt課件,2 數據類型、運算符和表達式運算符④邏輯運算 【例一】運行結,2,數據類型、運算符和表達式,運算符,⑤條件運算,,,…,?,… : …,,(三元運算符,即需連接三個運算量),一般形式:,,,e1,?,e2:e3,,(,e1,為條件表達式,,e2,e3,為任意類型表達式),功能:,如果,e1≠0,(為真),運算結果為,e2,的值。
如果,e1=0,(為假),則取,e3,的值例,】,分別令,x=3,x=0,x= -5,,求運行結果main( ),{ int x,y;,printf(“Input x=”);,scanf(“%d”,,y=x>0?1:x<0?-1:0;,/*,結合方向:由右向左*,/,printf(“x=%d,y=%d\n”,x,y);,},結果:,x=3,y=1,x=0,y=0,x=-5,y=-1,,1,(x>0),,y= 0,(x=0),,-1,(x<0),,28,ppt課件,2 數據類型、運算符和表達式運算符⑤條件運算 【例】分別令,2,數據類型、運算符和表達式,運算符,⑥位操作運算符,,,&,(,與,AND),|,(或,OR,),^,(異或,XOR,),,~,(非,NOT,),,,<<,(左移),>>,(右移),29,ppt課件,2 數據類型、運算符和表達式運算符⑥位操作運算符 29pp,2,數據類型、運算符和表達式,運算符的優(yōu)先級,返回,30,ppt課件,2 數據類型、運算符和表達式運算符的優(yōu)先級返回30ppt課件,3,程序控制語句,條件控制語句,if,語句,1,、簡單,if,語句,if,(,表達式,),{,程序段,},下面程序的功能是:,如果輸入的數據大于等于,60,,則輸出,You are passed!,:,scanf(“%d”,,if,(,x>=60,),{,,printf(“You are passed!\n”);,},31,ppt課件,3 程序控制語句條件控制語句if語句1、簡單if語句 31p,3,程序控制語句,條件控制語句,2,、,if-else,語句,if(,表達式,),{,,程序段,,},else,{,,程序段,},如果輸入的數據大于等于,60,,則輸出,You are passed!,否則輸出,You failed!,scanf(,“,%d,”,,,if(x>=60),{,,printf(,“,You are passed!\n,”,);,},else,{,printf(,“,You failed!\n,”,);,},if,語句,32,ppt課件,3 程序控制語句條件控制語句2、if-else語句如果輸入的,3,程序控制語句,條件控制語句,#include ,main(),{,int x,y=100,z=0;,x=180;,if(x
因為沒有了,break,語句,,switch,語句會被執(zhí)行到語句結束3,程序控制語句,條件控制語句,switch,語句,char ch=‘N’;,switch(ch),{,case 'Y':printf("Yes\n");,break;,case 'N':printf("No\n");,,,break;,case 'A':printf("All\n");,break;,},char ch=‘N’;,switch(ch),{,case 'Y':printf("Yes\n");,break;,case 'N':printf("No\n");,,case 'A':printf("All\n");,break;,},輸出:,No,輸出:,No,All,37,ppt課件,break子句可以省略,但是否省略break子句,3,程序控制語句,循環(huán)控制語句,while,語句,while,語句的形式:,while,(,表達式,P,),{,程序段,S,},,int a;,long sum;//sum should be long type,sum=0;,a=1;,while(a<=100),{,sum+=a;,a++;,},printf("1+2+...+%d=%ld\n",100,sum);,while,語句的例子:計算,1+2+3+,…,+100,的值,,通常情況下,程序中會利用,一個,變量,來,控制,while,語句的表,達式,P,的值,這個變量被稱為,循,環(huán)控制變量,。
在執(zhí)行,while,語句,之前,循環(huán)控制變量,必須初始化,,否則執(zhí)行的結果將是不可預知的上面的程序重新編寫,其運行結果將是不可預知的,因為,a,未初始化:,,int a;,long sum;//sum should be long type,sum=0;,,//a should be initialized here,,,while(a<=100),{,sum+=a;,a++;,},printf("1+2+...+%d=%ld\n",100,sum);,38,ppt課件,3 程序控制語句循環(huán)控制語句while語句while語句的形,3,程序控制語句,循環(huán)控制語句,while,語句,有關,while,語句的幾點說明,1,、要在,while,語句的某處(表達式,P,或循環(huán)體內)改變循環(huán)控制變量的值,否則極易構成,死循環(huán),下面的,while,語句便是死循環(huán):,x=2;,while(x<10),{//,死循環(huán),因為,x,的值沒有變化,永遠小于,10,sum+=x;,},printf(“%ld”,sum);,39,ppt課件,3 程序控制語句循環(huán)控制語句while語句有關while語句,3,程序控制語句,循環(huán)控制語句,while,語句,有關,while,語句的幾點說明,2,、如果在執(zhí)行循環(huán)體過程中,遇到了,break,子句,則跳出,while,循環(huán)。
比如,上面求,1+2+…+100,的程序可以這樣設計:,a=1;,sum=0;,while(1),{,if(a>100)break;,sum+=a;,a++;,},40,ppt課件,3 程序控制語句循環(huán)控制語句while語句有關while語句,3,程序控制語句,循環(huán)控制語句,while,語句,有關,while,語句的幾點說明,3,、如果在執(zhí)行循環(huán)體過程中,遇到了,continue,語句,則循環(huán)體中,continue,語句后面的其他語句將被跳過,而直接進入下一輪循環(huán)a=1;,while(a<=10),{,printf("%d",a);,a++;,if(a%5==1),continue;,printf("*");,},運行結果:,12,*3*4*5*,67,*8*9*10,41,ppt課件,3 程序控制語句循環(huán)控制語句while語句有關while語句,3,程序控制語句,循環(huán)控制語句,do-while,語句,do-while,語句的形式:,do,{,,程序段,S,},while(,表達式,P);,do-while,語句的例子:計算,1+2+3+,…,+100,的值,,int a;,long sum;,sum=0;,a=1;,,do,{,,,sum+=a;,a++;,,},while(a<=100);,,printf("1+2+...+%d=%ld\n",100,sum);,,,do-while,語句與,while,語句大體相同,但要特別注意,,while( ),后面的分號不要漏掉。
此外,,while,語句的循環(huán)體可能永遠不被執(zhí)行,但,do-while,語句的循環(huán)體至少被執(zhí)行一次42,ppt課件,3 程序控制語句循環(huán)控制語句do-while語句do-whi,3,程序控制語句,循環(huán)控制語句,for,語句,for,語句的形式:,必須是分號 必須是分號,↓ ↓,for,(,表達式,1,,;,,表達式,2,,;,,表達式,3,),{,,程序段,S,},,43,ppt課件,3 程序控制語句循環(huán)控制語句for語句for語句的形式: 4,3,程序控制語句,循環(huán)控制語句,for,語句,,int a;,long sum;,sum=0;,,for,(,a=1,;,a<=100,;,a++,),{,,sum+=a;,},printf("1+2+...+%d=%ld\n",100,sum);,for,語句的例子:用,for,語句實現(xiàn),1+2+…+100,求和,44,ppt課件,3 程序控制語句循環(huán)控制語句for語句 int a; for,3,程序控制語句,三種循環(huán)控制語句的比較,在使用,while,和,do-while,語句時,循環(huán)控制變量的變化必須放在循環(huán)體內而,for,語句卻可以利用表達式,3,來改變循環(huán)控制變量的值。
在使用,while,和,do-while,語句時,必須在,while,或,do-while,語句前初始化循環(huán)控制變量但,for,語句卻可以利用表達式,1,來初始化循環(huán)控制變量do-while,語句的循環(huán)體至少被執(zhí)行一次,但,while,語句和,for,語句的循環(huán)體可能一次也執(zhí)行不到while,語句和,do-while,語句中不能省略循環(huán)條件(即表達式,P,),但,for,語句卻可以省略循環(huán)條件(即表達式,2,)break,語句和,continue,語句在這,3,種循環(huán)語句中的作用是相同的凡是用,while,語句能實現(xiàn)的循環(huán),必然能用,for,語句實現(xiàn),反過來也一樣45,ppt課件,3 程序控制語句三種循環(huán)控制語句的比較在使用while和do,3,程序控制語句,三種循環(huán)控制語句的選用及循環(huán)嵌套,返回,46,ppt課件,3 程序控制語句三種循環(huán)控制語句的選用及循環(huán)嵌套返回46pp,4,函數及其調用,C,語言的函數是,子程序,的總稱,,包括函數和過程有返回值,、,無返回值,,,有參函數,,,無參函數,)C,語言函數可以分為,庫函數,、用戶,自定義函數,庫函數由系統(tǒng)提供,程序員只需要使用(,調用,),用戶自定義函數需要程序員,自己編制,。
C,語言的程序由,函數,組成,函數是,C,語言程序的,基本單位47,ppt課件,4 函數及其調用C語言的函數是子程序的總稱,包括函數和過程4,函數及其調用,C,語言程序的,結構如圖,所示在每個程序中,,主函數,main,是必須的,它是所有程序的,執(zhí)行起點,,,main,函數,只調用,其它函數,不能為其它函數調用其它函數,沒有,主從關系,可以,相互調用,所有函數都可以調用,庫函數,程序的總體功能通過,函數的調用,來實現(xiàn)f11( ),{…},f11( ),{…},f31( ),{…},f1( ),{…,f11( );,…},f2( ),{…,f11( );,f22( );,…},main( ),{…,f1( );,…,f2( );,…},48,ppt課件,4 函數及其調用C語言程序的結構如圖所示在每個程序中,主函,4,函數及其調用,函數應當,先定義,,,后調用,,函數定義的一般形式,函數返回值的數據類型,,函數名,(,類型名 變量名,1,,,,類型名 變量名,2,,,……,),,{,聲明部分,//,定義本函數所使用的變量和進行有關聲明(,如函數聲明,),處理語句,//,程序段,由若干條語句組成(可以在其中,調用其它函數,),,},【,注意,】,無形參表的即無參函數。
無函數體的為“空函數”如果函數返回值的數據類型為,int,,可以省略之如果不返回值,定義為,void,類型49,ppt課件,4 函數及其調用函數應當先定義,后調用 49ppt課件,4,函數及其調用,函數定義舉例:,main(),{ int n1,n2,n3,nmax;,scanf(“%d%d%d”,,if(n1>n2),nmax=n1;,else nmax=n2;,if(n3>nmax),nmax=n3;,printf(“max=%d\n”,,,nmax);,},,輸入三個整數,求三個整數中的最大值,不使用函數,(,除,main,外,),int max(int,int,int);,main(),{ int n1,n2,n3,nmax;,scanf(“%d%d%d”,,nmax=max(n1,n2,n3);,printf(“max=%d\n “,nmax);,},int max(int x,int y,int z),{ int m;,if(x>y),m=x;,else,m=y;,if(z>m)m=z;,return m;,},輸入三個整數,求三個整數中的最大值,使用函數,子函數定義,50,ppt課件,4 函數及其調用函數定義舉例:輸入三個整數,求三個整數中的最,形式參數與實際參數,,1,、,形式參數,(形參):函數定義時設定的參數。
前例中,函數頭,int max(int x,int y,int z),中,x,y,z,就是形參,它們的類型都是整型2,、,實際參數,(實參):調用函數時所使用的實際的參數前例中,主函數中調用,max,函數的語句是:,nmax=max(n1,n2,n3);,其中,n1,n2,n3,就是實參,它們的類型都是整型關于形參和實參的說明:,a,、形參只有當調用時才臨時分配存儲單元b,、實參一定要有確定的值,可以是表達式c,、實參和形參的類型應相同或賦值相容4,函數及其調用,51,ppt課件,形式參數與實際參數 4 函數及其調用51ppt課件,4,函數及其調用,形式參數與實際參數,,52,ppt課件,4 函數及其調用形式參數與實際參數 52ppt課件,4,函數及其調用,函數的返回值,C,語言可以從函數(被調用函數)返回值給調用函數(這與數學函數相當類似)在函數內是通過,return,語句返回值的函數可以使用一個或者多個,return,語句返回值也可以不返回值(此時函數類型是,void,)return,語句的格式:,,return,[,表達式,],;或,return,,(表達式),;,說明:,函數的類型就是返回值的類型,,return,語句中表達式的類型應該與函數類型一致。
如果不一致,以,函數類型,為準(賦值轉化)53,ppt課件,4 函數及其調用函數的返回值C語言可以從函數(被調用函數)返,4,函數及其調用,局部變量,,概念:,是指在一定范圍內有效的變量C,語言中,在以下各位置定義的變量均屬于局部變量在函數體內定義的變量:,在本函數范圍內有效,作用域局限于函數體內在復合語句內定義的變量:,在本復合語句范圍內有效,作用域局限于復合語句內有參函數的形式參數也是局部變量:,只在其所在的函數范圍內有效54,ppt課件,4 函數及其調用 局部變量54ppt課件,4,函數及其調用,全局變量,,全局變量:,在函數之外定義的變量所有函數前,各個函數之間,所有函數后),,全局變量作用域:,從定義全局變量的位置起到本源程序結束為止在引用全局變量時如果使用,“,extern,”,聲明全局變量,可以擴大全局變量的作用域例如,擴大到整個源文件(模塊),對于多源文件(模塊)可以擴大到其它源文件(模塊)全局變量和局部變量同名的,“,屏蔽,”,55,ppt課件,4 函數及其調用 全局變量55ppt課件,4,函數及其調用,全局變量和局部變量的應用,局部變量,輸出結果,count is 100,56,ppt課件,4 函數及其調用全局變量和局部變量的應用局部變量輸出結果56,4,函數及其調用,變量,(局部,/,全局)兩大屬性:,·,數據類型,,·,存儲類別,1,、,數據類型(復習),通過變量說明(定義)來規(guī)定其數據類型:,,格式,數據類型關鍵字 變量名,如,char a;,int b,c ;,float x,y;,,為什么使用變量前要先對其數據類型進行“說明”,——,好比看電影前先買票訂座,,◆,預留存儲空間(如,char,型為,1,個字節(jié),,int,型為,2,個字節(jié),…,),,◆,確定存儲方式(如,char,型存放,ASCII,值,,int,型存放補碼值,…,),57,ppt課件,4 函數及其調用變量(局部/全局)兩大屬性: ·數據類型,變量,(局部,/,全局)兩大屬性:,·,數據類型,,·,存儲類別,4,函數及其調用,2,、存儲類別,規(guī)定了變量在計算機內部的存放位置→決定變量的“壽命”(何時“生”,何時“滅”),一個完整的變量說明格式如下:,,存儲類別 數據類型 變量名,如,static int x , y ;,C,程序的存儲類別有:,,■,register,型,(寄存器型),■,auto,型,(自動變量型),■,static,型,(靜態(tài)變量型),■,extern,型,(外部變量型),58,ppt課件,變量(局部/全局)兩大屬性: ·數據類型 ·存儲類別4,C,程序的變量存儲位置,4,函數及其調用,變量的生存期,,靜態(tài)存儲區(qū)中的變量:,與程序,“,共存亡,”,動態(tài)存儲區(qū)中的變量:,與函數,“,共存亡,”,寄存器中的變量:,同靜態(tài)存儲區(qū),59,ppt課件,C程序的變量存儲位置4 函數及其調用變量的生存期59ppt課,4,函數及其調用,C,程序的變量存儲類別,■,register,型(寄存器型),變量值存放在運算器的,寄存器,中,——,存取速度快,一般只允許存,2,~,3,個變量,且限于,char,型和,int,型,通常用于循環(huán)變量。
■,auto,型(自動變量型),變量值存放在主存儲器的,動態(tài)存儲區(qū),(堆棧方式);,優(yōu)點,——,同一內存區(qū)可被不同變量反復使用以上兩種變量均屬于“,動態(tài)存儲型,”,即調用函數時才為這些變量分配單元,函數調用結束其值自動消失60,ppt課件,4 函數及其調用C程序的變量存儲類別■ register型(,4,函數及其調用,C,程序的變量存儲類別,■,static,型(靜態(tài)變量型),變量值存放在主存儲器的,靜態(tài)存儲區(qū),程序執(zhí)行開始至結束,始終占用該存儲空間,■,extern,型(外部變量型),同上,其值可供其他源文件使用,以上兩種均屬于“,靜態(tài)存儲,”性質,即從變量定義處開始,在整個程序執(zhí)行期間其值都存在,(≠都可用,!!,),61,ppt課件,4 函數及其調用C程序的變量存儲類別■ static型(靜態(tài),4,函數及其調用,,auto,(默認) 所在函數調用結束時,其值自動消失,局部變量,,,register,,如不賦初值,取不確定值為初值,,static,,所有函數調用結束,其值仍保留,如不賦初值,取初值為,0,(數值型)或空字符,’,\0’,(字符型),,,extern,(默認)允許本源文件中其他函數及其他,全局變量,源文件使用,,static,,只限本源文件中使用,,62,ppt課件,4 函數及其調用,4,函數及其調用,求程序運行結果,main(),{,int a=2,i;,,clrscr( );//,清楚屏幕,內部函數,for (i=0;i<3;i++),printf("%4d",f(a));,},f(int a),{,int b=0;,static int c=3;,b++;c++;,return a+b+c;,},變量跟蹤,,main,( ),f,函數,,a i,b,,c,f(a),2 0 0→1 4 7,1 0→1 5 8,2 0→1 6 9,,【,結果,】 7 8 9,如果去掉,static,呢?,【,結果,】 7 7 7,63,ppt課件,4 函數及其調用求程序運行結果main()變量跟蹤如果去掉s,4,函數及其調用,求程序運行結果,main(),{,int k=4,m=1,p;,clrscr();,p=func(k,m);,printf("%d,",p);,p=func(k,m);,printf("%d",p);,},func(int a,int b),{ static int m=0,i=2;,i+=m+1;,m=i+a+b;,return m;,},變量跟蹤,,main,( ),func,函數,,k m,,a b m i,4 1 4 1 0→8 2→3,4 1 4 1 8→17 3→12,,【,結果,】 8, 17,如果去掉,static,呢?,【,結果,】 8, 8,64,ppt課件,4 函數及其調用求程序運行結果main()變量跟蹤如果去掉s,4,函數及其調用,求程序運行結果,#include ,main(),{,int a=3, b=2, c=1; //,注意應用范圍,{,int b=5, c=12;//,注意應用范圍,c-=b*2;,printf("a=%d,b=%d,c=%d\n", a, b, c);,a+=c;,},printf("a=%d,b=%d,c=%d\n", a, b, c);,},【,結果,】,a=3,b=5,c=2,a=5,b=2,c=1,65,ppt課件,4 函數及其調用求程序運行結果#include
條件編譯,5,編譯預處理,②,#i。