




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
7.8局部變量和全局變量7.8.1局部變量7.8.2全局變量第1頁/共71頁第一頁,共72頁。7.8.1局部變量定義變量可能有三種情況:在函數的開頭定義在函數內的復合語句內定義在函數的外部定義第2頁/共71頁第二頁,共72頁。7.8.1局部變量在一個函數內部定義的變量只在本函數范圍內有效在復合語句內定義的變量只在本復合語句范圍內有效在函數內部或復合語句內部定義的變量稱為“局部變量”第3頁/共71頁第三頁,共72頁。floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}a、b、c僅在此函數內有效x、y、i、j僅在此函數內有效m、n僅在此函數內有效第4頁/共71頁第四頁,共72頁。floatf1(inta){intb,c;……}charf2(intx,inty){inti,j;……}intmain(){inta,b;……return0;}類似于不同班同名學生a、b也僅在此函數內有效第5頁/共71頁第五頁,共72頁。intmain(){inta,b;……{intc;
c=a+b;……}……}c僅在此復合語句內有效a、b僅在此復合語句內有效第6頁/共71頁第六頁,共72頁。7.8.2全局變量在函數內定義的變量是局部變量,而在函數之外定義的變量稱為外部變量外部變量是全局變量(也稱全程變量)全局變量可以為本文件中其他函數所共用有效范圍為從定義變量的位置開始到本源文件結束第7頁/共71頁第七頁,共72頁。intp=1,q=5floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}p、q、c1、c2為全局變量第8頁/共71頁第八頁,共72頁。intp=1,q=5floatf1(inta){intb,c;……}charc1,c2;charf2(intx,inty){inti,j;……}intmain(){intm,n;……return0;}p、q的有效范圍c1、c2的有效范圍第9頁/共71頁第九頁,共72頁。
例7.14有一個一維數組,內放10個學生成績,寫一個函數,當主函數調用此函數后,能求出平均分、最高分和最低分。解題思路:調用一個函數可以得到一個函數返回值,現在希望通過函數調用能得到3個結果??梢岳萌肿兞縼磉_到此目的。第10頁/共71頁第十頁,共72頁。#include<stdio.h>floatMax=0,Min=0;intmain(){floataverage(floatarray[],intn);floatave,score[10];inti;printf("Pleaseenter10scores:\n");
for(i=0;i<10;i++)scanf("%f",&score[i]);
ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);return0;}第11頁/共71頁第十一頁,共72頁。floataverage(floatarray[],intn){inti;floataver,sum=array[0];Max=Min=array[0];for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];elseif(array[i]<Min)Min=array[i];sum=sum+array[i];}aver=sum/n;return(aver);}第12頁/共71頁第十二頁,共72頁。avescore10MaxMinaverarraynMaxMinmain函數average函數建議不在必要時不要使用全局變量第13頁/共71頁第十三頁,共72頁。
例7.15若外部變量與局部變量同名,分析結果。第14頁/共71頁第十四頁,共72頁。#include<stdio.h>inta=3,b=5;intmain(){intmax(inta,intb);inta=8;printf(“max=%d\n”,max(a,b));return0;}
intmax(inta,intb){intc;c=a>b?a:b;return(c);}a為局部變量,僅在此函數內有效b為全部變量第15頁/共71頁第十五頁,共72頁。#include<stdio.h>inta=3,b=5;intmain(){intmax(inta,intb);inta=8;printf(“max=%d\n”,max(a,b));return0;}
intmax(inta,intb){intc;c=a>b?a:b;return(c);}a、b為局部變量,僅在此函數內有效第16頁/共71頁第十六頁,共72頁。7.9變量的存儲方式和生存期7.9.1動態存儲方式與靜態存儲方式7.9.2局部變量的存儲類別7.9.3全局變量的存儲類別7.9.4存儲類別小結第17頁/共71頁第十七頁,共72頁。7.9.1動態存儲方式與靜態存儲方式從變量的作用域的角度來觀察,變量可以分為全局變量和局部變量從變量值存在的時間(即生存期)觀察,變量的存儲有兩種不同的方式:靜態存儲方式和動態存儲方式靜態存儲方式是指在程序運行期間由系統分配固定的存儲空間的方式動態存儲方式是在程序運行期間根據需要進行動態的分配存儲空間的方式第18頁/共71頁第十八頁,共72頁。程序區靜態存儲區動態存儲區用戶區將數據存放在此區全局變量全部存放在靜態存儲區中①函數形式參數②函數中定義的沒有用關鍵字static聲明的變量③函數調用時的現場保護和返回地址等存放在動態存儲區程序開始執行時給全局變量分配存儲區,程序執行完畢就釋放。在程序執行過程中占據固定的存儲單元函數調用開始時分配,函數結束時釋放。在程序執行過程中,這種分配和釋放是動態的第19頁/共71頁第十九頁,共72頁。每一個變量和函數都有兩個屬性:
數據類型和數據的存儲類別數據類型,如整型、浮點型等存儲類別指的是數據在內存中存儲的方式(如靜態存儲和動態存儲)存儲類別包括:
自動的、靜態的、寄存器的、外部的根據變量的存儲類別,可以知道變量的作用域和生存期第20頁/共71頁第二十頁,共72頁。7.9.2局部變量的存儲類別1.自動變量(auto變量)局部變量,如果不專門聲明存儲類別,都是動態地分配存儲空間的調用函數時,系統會給局部變量分配存儲空間,調用結束時就自動釋放空間。因此這類局部變量稱為自動變量自動變量用關鍵字auto作存儲類別的聲明第21頁/共71頁第二十一頁,共72頁。7.9.2局部變量的存儲類別intf(inta){autointb,c=3;
┇}可以省略第22頁/共71頁第二十二頁,共72頁。7.9.2局部變量的存儲類別2.靜態局部變量(static局部變量)希望函數中的局部變量在函數調用結束后不消失而繼續保留原值,即其占用的存儲單元不釋放,在下一次再調用該函數時,該變量已有值(就是上一次函數調用結束時的值),這時就應該指定該局部變量為“靜態局部變量”,用關鍵字static進行聲明第23頁/共71頁第二十三頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}調用三次每調用一次,開辟新a和b,但c不是第24頁/共71頁第二十四頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}03bc第一次調用開始第25頁/共71頁第二十五頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}03bc第一次調用期間14第26頁/共71頁第二十六頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第一次調用結束147第27頁/共71頁第二十七頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第二次調用開始04第28頁/共71頁第二十八頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第二次調用期間0451第29頁/共71頁第二十九頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第二次調用結束158第30頁/共71頁第三十頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第三次調用開始05第31頁/共71頁第三十一頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第三次調用期間0561第32頁/共71頁第三十二頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}bc第三次調用結束169第33頁/共71頁第三十三頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}c整個程序結束6第34頁/共71頁第三十四頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}在編譯時賦初值在函數調用時賦初值第35頁/共71頁第三十五頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}若不賦初值,是0若不賦初值,不確定第36頁/共71頁第三十六頁,共72頁。
例7.16考察靜態局部變量的值。#include<stdio.h>intmain(){intf(int);inta=2,i;for(i=0;i<3;i++)printf(“%d\n”,f(a));return0;}intf(inta){autointb=0;
staticc=3;b=b+1;c=c+1;return(a+b+c);}僅在本函數內有效第37頁/共71頁第三十七頁,共72頁。例7.17輸出1到5的階乘值。解題思路:可以編一個函數用來進行連乘,如第1次調用時進行1乘1,第2次調用時再乘以2,第3次調用時再乘以3,依此規律進行下去。第38頁/共71頁第三十八頁,共72頁。#include<stdio.h>intmain(){intfac(intn);inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));return0;}intfac(intn){staticintf=1;f=f*n;return(f);}若非必要,不要多用靜態局部變量第39頁/共71頁第三十九頁,共72頁。3.寄存器變量(register變量)一般情況下,變量(包括靜態存儲方式和動態存儲方式)的值是存放在內存中的寄存器變量允許將局部變量的值放在CPU中的寄存器中現在的計算機能夠識別使用頻繁的變量,從而自動地將這些變量放在寄存器中,而不需要程序設計者指定第40頁/共71頁第四十頁,共72頁。7.9.3全局變量的存儲類別全局變量都是存放在靜態存儲區中的。因此它們的生存期是固定的,存在于程序的整個運行過程一般來說,外部變量是在函數的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內,全局變量可以為程序中各個函數所引用。第41頁/共71頁第四十一頁,共72頁。1.在一個文件內擴展外部變量的作用域外部變量有效的作用范圍只限于定義處到本文件結束。如果用關鍵字extern對某變量作“外部變量聲明”,則可以從“聲明”處起,合法地使用該外部變量第42頁/共71頁第四十二頁,共72頁。例7.18調用函數,求3個整數中的大者。解題思路:用extern聲明外部變量,擴展外部變量在程序文件中的作用域。第43頁/共71頁第四十三頁,共72頁。#include<stdio.h>intmain(){intmax();
externintA,B,C;scanf(“%d%d%d”,&A,&B,&C);printf("maxis%d\n",max());return0;}
intA,B,C;
intmax(){intm;m=A>B?A:B;if(C>m)m=C;return(m);}第44頁/共71頁第四十四頁,共72頁。2.將外部變量的作用域擴展到其他文件如果一個程序包含兩個文件,在兩個文件中都要用到同一個外部變量Num,不能分別在兩個文件中各自定義一個外部變量Num應在任一個文件中定義外部變量Num,而在另一文件中用extern對Num作“外部變量聲明”在編譯和連接時,系統會由此知道Num有“外部鏈接”,可以從別處找到已定義的外部變量Num,并將在另一文件中定義的外部變量num的作用域擴展到本文件第45頁/共71頁第四十五頁,共72頁。
例7.19給定b的值,輸入a和m,求a*b和am的值。解題思路:分別編寫兩個文件模塊,其中文件file1包含主函數,另一個文件file2包含求am的函數。在file1文件中定義外部變量A,在file2中用extern聲明外部變量A,把A的作用域擴展到file2文件。第46頁/共71頁第四十六頁,共72頁。文件file1.c:#include<stdio.h>intA;intmain(){intpower(int);intb=3,c,d,m;scanf("%d,%d",&A,&m);c=A*b;printf("%d*%d=%d\n",A,b,c);d=power(m);printf("%d**%d=%d\n",A,m,d);return0;}第47頁/共71頁第四十七頁,共72頁。文件file2.c:externA;intpower(intn){inti,y=1;for(i=1;i<=n;i++)y*=A;return(y);}編譯和運行包括多個文件的程序,可參考《C程序設計學習輔導》一書的“C語言上機指南”部分第48頁/共71頁第四十八頁,共72頁。3.將外部變量的作用域限制在本文件中有時在程序設計中希望某些外部變量只限于被本文件引用。這時可以在定義外部變量時加一個static聲明。file1.cstaticintA;intmain(){……}file2.cexternA;voidfun(intn){……A=A*n;……}只能用于本文件本文件仍然不能用第49頁/共71頁第四十九頁,共72頁。說明:不要誤認為對外部變量加static聲明后才采取靜態存儲方式,而不加static的是采取動態存儲聲明局部變量的存儲類型和聲明全局變量的存儲類型的含義是不同的對于局部變量來說,聲明存儲類型的作用是指定變量存儲的區域以及由此產生的生存期的問題,而對于全局變量來說,聲明存儲類型的作用是變量作用域的擴展問題第50頁/共71頁第五十頁,共72頁。用static聲明一個變量的作用是:(1)對局部變量用static聲明,把它分配在靜態存儲區,該變量在整個程序執行期間不釋放,其所分配的空間始終存在。(2)對全局變量用static聲明,則該變量的作用域只限于本文件模塊(即被聲明的文件中)。第51頁/共71頁第五十一頁,共72頁。注意:用auto、register、static聲明變量時,是在定義變量的基礎上加上這些關鍵字,而不能單獨使用。下面用法不對:inta;statica;
編譯時會被認為“重新定義”。第52頁/共71頁第五十二頁,共72頁。7.9.4存儲類別小結對一個數據的定義,需要指定兩種屬性:數據類型和存儲類別,分別使用兩個關鍵字例如:staticinta;autocharc;registerintd;可以用extern聲明已定義的外部變量例如:externb;靜態局部整型變量或靜態外部整型變量自動變量,在函數內定義寄存器變量,在函數內定義將已定義的外部變量b的作用域擴展至此第53頁/共71頁第五十三頁,共72頁。(1)從作用域角度分,有局部變量和全局變量。它們采用的存儲類別如下:按作用域角度分局部變量全局變量自動變量靜態局部變量寄存器變量靜態外部變量外部變量形式參數可以定義為自動變量或寄存器變量第54頁/共71頁第五十四頁,共72頁。(2)從變量存在的時間區分,有動態存儲和靜態存儲兩種類型。靜態存儲是程序整個運行時間都存在,而動態存儲則是在調用函數時臨時分配單元按生存期分動態存儲靜態存儲自動變量寄存器變量靜態局部變量外部變量形式參數靜態外部變量第55頁/共71頁第五十五頁,共72頁。(3)從變量值存放的位置來區分,可分為:按變量值存放的位置分內存中靜態存儲區內存中動態存儲區靜態局部變量靜態外部變量自動變量和形式參數寄存器變量外部變量CPU中的寄存器第56頁/共71頁第五十六頁,共72頁。(4)關于作用域和生存期的概念對一個變量的屬性可以從兩個方面分析:作用域:如果一個變量在某個文件或函數范圍內是有效的,就稱該范圍為該變量的作用域生存期:如果一個變量值在某一時刻是存在的,則認為這一時刻屬于該變量的生存期作用域是從空間的角度,生存期是從時間的角度二者有聯系但不是同一回事第57頁/共71頁第五十七頁,共72頁。inta;intmain(){…f2();…f1();…}voidf1(){autointb;…f2();…}voidf2(){staticintc;……}a的作用域b的作用域c的作用域文件file1.c第58頁/共71頁第五十八頁,共72頁。a生存期b生存期c生存期mainf2f1mainf2f1main程序執行過程第59頁/共71頁第五十九頁,共72頁。變量存儲類別函數內函數外作用域存在性作用域存在性自動變量和寄存器變量∨∨╳╳靜態局部變量∨∨╳∨靜態外部變量∨∨∨(只限本文件)∨外部變量∨∨∨∨各種類型變量的作用域和存在性的情況第60頁/共71頁第六十頁,共72頁。(5)static對局部變量和全局變量的作用不同局部變量使變量由動態存儲方式改變為靜態存儲方式全局變量使變量局部化(局部于本文件),但仍為靜態存儲方式從作用域角度看,凡有static聲明的,其作用域都是局限的,或者是局限于本函數內(靜態局部變量),或者局限于本文件內(靜態外部變量)第61頁/共71頁第六十一頁,共72頁。7.10關于變量的聲明和定義一般為了敘述方便,把建立存儲空間的變量聲明稱定義,而把不需要建立存儲空間的聲明稱為聲明在函數中出現的對變量的聲明(除了用extern聲明的以外)都是定義在函數中對其他函數的聲明不是函數的定義第62頁/共71頁第六十二頁,共72頁。7.11內部函數和外部函數7.11.1內部函數7.11.2外部函數第63頁/共71頁第六十三頁,共72頁。7.11.1內部函數如果一個函數只能被本文件中其他函數所調用,它稱為內部函數。在定義內部函數時,在函數名和函數類型的前面加static,即:static類型名函數名(形參表)第64頁/共71頁第六十四頁,共72頁。7.11.1內部函數內部函數又稱靜態函數,因為它是用static聲明的通常把只能由本文件使用的函數和外部變量放在文件的開頭,前面都冠以static使之局部化,其他文件不能引用提高了程序的可靠性第65頁/共71頁第六十五頁,共72頁。7.11.2外部函數如果在定義函數時,在函數首部的最左端加關鍵字extern,則此函數是外部函數,可供其他
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 領導力培訓與大數據分析的融合
- 風能與太陽能技術在船舶動力中的應用
- 項目管理高效團隊的運作與管理
- 顧客體驗優化在新零售教育領域的應用
- 顧客體驗優化實踐從需求出發的零售策略
- 青少年網絡數據隱私保護指南
- 非物質文化遺產的數字化保護策略與實踐探索
- 非洲的綠色能源投資市場分析
- 青少年航天科普教育策略探討
- 隱私政策用戶權益的保障書
- 放射科出科試題 及答案
- 炊事員培訓試題及答案
- 辦公大樓保安試題及答案
- 全國100所名校2025屆高考沖刺模擬英語試題含答案
- 職業技能等級認定考試保密協議書
- 2024年云南曲靖公開招聘社區工作者考試試題答案解析
- 廣東省深圳市2025年高三年級下學期第二次調研考試語文試題(含答案)
- 國家開放大學《創業基礎》第三次形考任務答案
- 研發實驗室試題及答案
- 運動與代謝綜合征-全面剖析
- 犢牛腹瀉防控課件
評論
0/150
提交評論