- // 局部變量和全局變量
- 定義變量可能有3種情況:
- 1.在函數的開頭定義
- 2.在函數內的複合語句內定義
- 3.在函數的外部定義
- 在函數內定義的變量是局部變量,在函數之外定義的變量是全局變量
- 爲了便於區別全局變量和局部變量,在C程序設計人員中有一個習慣(但非規定),
- 將全局變量名的第1個字母用大寫表示。
- 有一個一維數組,內放10個學生成績,寫一個函數,當主函數調用此函數後,
- 能求出平均分、最高分和最低分。
- #include "stdafx.h"
- float Max=0,Min=0;
- int main()
- {
- float average(float array[ ],int n);
- float ave,score[10];
- int i;
- printf("Please enter 10 scores:");
- for(i=0;i<10;i++)
- scanf_s("%f",&score[i]);
- ave=average(score,10);
- printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
- return 0;
- }
- float average(float array[ ],int n)
- {
- int i;
- float aver,sum=array[0];
- Max=Min=array[0];
- for(i=1;i<n;i++)
- {
- if(array[i]>Max)
- Max=array[i];
- else
- if(array[i]<Min)
- Min=array[i];
- sum=sum+array[i];
- }
- aver=sum/n;
- return(aver);
- }
- // 動態存儲方式與靜態存儲方式
- 變量的存儲有兩種不同的方式:
- 靜態存儲方式和動態存儲方式
- 靜態存儲方式是指在程序運行期間由系統分配固定的存儲空間的方式。
- 動態存儲方式是指在程序運行期間根據需要進行動態的分配存儲空間的方式。
- 動態存儲區中存放以下數據:
- 1.函數形式參數:在調用函數時給形參分配存儲空間
- 2.函數中定義的沒有用關鍵字static聲明的變量,即自動變量
- 3.函數調用時的現場保護和返回地址等。
- 在C語言中,每一個變量和函數都有兩個屬性: 數據類型 和 數據的存儲類別 。
- C的存儲類別包括4種:自動的(auto)、靜態的(static)、寄存器的(register)、外部的(extern)
- // 局部變量的存儲類別
- 1.自動變量(auto 變量)
- int f(int a) //定義f函數,a爲形參
- {
- auto int b,c=3; //定義b,c爲自動變量
- ...
- }
- 其中,a是形參,b和c是自動變量,對c賦初值3
- 執行完f函數後,自動釋放a,b,c所佔的存儲單元
- 實際上,關鍵字"auto"可以省略,不寫 auto 則隱含指定爲"自動存儲類別",它屬於動態存儲方式
- 程序中大多數變量屬於自動變量。
- int b,c=3;
- 與
- auto int b,c=3;
- 等價。
- 2.靜態局部變量(static局部變量)
- 考察靜態局部變量的值
- #include "stdafx.h"
- int main()
- {
- int f(int); //函數聲明
- int a=2,i; //自動局部變量
- for(i=0;i<3;i++)
- printf("%d\n",f(a)); //輸出f(a)的值
- return 0;
- }
- int f(int a)
- {
- auto int b=0; //自動局部變量
- static int c=3; //靜態局部變量
- b=b+1;
- c=c+1;
- return(a+b+c);
- }
- 輸出1到5的階乘值
- #include "stdafx.h"
- int main()
- {
- int fac(int n);
- int i;
- for(i=1;i<=5;i++)
- printf("%d!=%d\n",i,fac(i));
- return 0;
- }
- int fac(int n)
- {
- static int f=1;
- f=f*n;
- return(f);
- }
- 3.寄存器變量(register 變量)
- 用關鍵字 register 作聲明
- 如:
- register int f; //定義f爲寄存器變量
- // 全局變量的存儲類別
- 1.在一個文件內擴展外部變量的作用域
- 在定義點之前的函數需要應用該外部變量,則應該在應用之前用關鍵字 extern
- 對該變量作"外部變量聲明",表示把該外部變量的作用域擴展到此位置。
- 調用函數,求3個整數中的大者
- #include "stdafx.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- int max();
- extern int A,B,C;
- printf("Please enter three integer numbers:");
- scanf_s("%d %d %d",&A,&B,&C);
- printf("max is %d\n",max());
- return 0;
- }
- int A,B,C;
- int max()
- {
- int m;
- m=A>B?A:B;
- if(C>m)
- m=C;
- return(m);
- }
- 2.將外部變量的作用域擴展到其他文件
- 在任一個文件中定義外部變量Num,而在另外一文件中用extern對Num作"外部變量聲明",
- 即"extern Num"。
- 給定b的值,輸入a和m,求a*b和a的m次方的值
- #include "stdafx.h"
- int A;
- int main()
- {
- int power(int);
- int b=3,c,d,m;
- printf("enter the number a and its power m:\n");
- scanf_s("%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);
- return 0;
- }
- extern int A;
- int power(int n)
- {
- int i,y=1;
- for(i=1;i<=n;i++)
- y*=A;
- return(y);
- }
- 3.將外部變量的作用域限制在本文件中
- 加上 static 聲明、只能用於本文將的外部變量稱爲 "靜態外部變量"
- 用 static 聲明一個變量的作用:
- a.對局部變量用 static 聲明,把它分配在靜態存儲區,該變量在整個程序執行期間不釋放,其所分配的空間始終存在
- b.對全局變量用 static 聲明,則該變量的作用域只限於本文件模塊(即被聲明的文件中)
- // 存儲類別小結
- 對一個數據的定義,需要制定兩種屬性:數據類型和存儲類別。
- static int a; //靜態局部整型變量或靜態外部整型變量
- auto char c; //自動變量,在函數內定義
- register int d; //寄存器變量,在函數內定義
- 可以用 extern 聲明已定義的外部變量,例如:
- extern b; //將已定義的外部變量b的作用域擴展至此
- (1)從作用域角度分,有局部變量和全局變量。它們採用的存儲類別如下:
- 局部變量 自動變量,即動態局部變量(離開函數,值就消失)
- 靜態局部變量(離開函數,值仍保留)
- 寄存器變量(離開函數,值就消失)
- (形式參數可以定義爲自動變量或寄存器變量)
- 全局變量 靜態外部變量
- 外部變量(即非靜態的外部變量,允許其他文件引用)
- (2)從變量存在的時間(生存期)來區分,有 動態存儲和靜態存儲 兩種類型
- 動態存儲 自動變量(本函數內有效)
- 寄存器變量(本函數內有效)
- 形式參數(本函數內有效)
- 靜態存儲 靜態局部變量(函數內有效)
- 靜態外部變量(本文件內有效)
- 外部變量(用extern聲明後,其他文件可應用)
- (3)從變量值存放的位置來區分
- 內存中靜態存儲區 靜態局部變量
- 靜態外部變量(函數外部靜態變量)
- 外部變量(可謂其他文件引用)
- 內存中動態存儲區 自動變量和形式參數
- CPU中的寄存器 寄存器變量
- (4)關於作用域和生存期的概念
- 如果某一個變量在某個文件或函數範圍內是有效的,就稱該範圍爲該變量的作用域。
- 如果一個變量值在某一時刻是存在的,則認爲這一時刻屬於該變量的生存期。
- (5)static 對局部變量和全局變量的作用不同
- 對局部變量來說,它使變量由動態存儲方式改變爲靜態存儲方式
- 而對全局變量來說,它使變量局部變化,但仍爲靜態存儲方式。