局部變量
局部變量也叫auto自動變量(auto可寫可不寫),一般情況下代碼塊{}內部定義的變量都是自動變量,它有如下特點:
- 在一個函數內定義,只在函數范圍內有效
- 在復合語句中定義,只在復合語句中有效
- 隨着函數調用的結束或復合語句的結束局部變量的聲明聲明周期也結束
- 如果沒有賦初值,內容為隨機
#include <stdio.h>
void test()
{
//auto寫不寫是一樣的
//auto只能出現在{}內部
auto int b = 10;//該局部變量只在該函數內有效
}
int main(void)
{
//b = 100; //err, 在main作用域中沒有b
if (1)
{
//在復合語句中定義,只在復合語句中有效
int a = 10;
printf("a = %d\n", a);
}
for(int flag = 1; flag<10;flag++)
{
//flag只能在這個循環里使用,因為只定義在了這個復合語句中,只在復合語句中有效
}
//a = 10; //err離開if()的復合語句,a已經不存在
return 0;
}
靜態(static)局部變量
static局部變量的作用域也是在定義的函數內有效
static局部變量的生命周期和程序運行周期一樣,同時staitc局部變量的值只初始化一次,但可以賦值多次
static局部變量若未賦以初值,則由系統自動賦值:數值型變量自動賦初值0,字符型變量賦空字符
#include <stdio.h>
void fun1()
{
int i = 0;
i++;
printf("i = %d\n", i);
}
void fun2()
{
//靜態局部變量,沒有賦值,系統賦值為0,而且只會初始化一次
static int a; //在數據區進行存儲
// fun2()一旦加載,static int a; 這條語句就會執行,而且是先於fun2()函數,
//后期執行該函數,也不會執行這條語句,而是跳過
a++;
printf("a = %d\n", a);
}
int main(void)
{
fun1();
fun1();
fun2();
fun2();
return 0;
}
全局變量
在函數外定義,可被本文件及其它文件中的函數所共用,若其它文件中的函數調用此變量,須用extern聲明
全局變量的生命周期和程序運行周期一樣
不同文件的全局變量不可重名
extern全局變量聲明
extern int a;聲明一個變量,這個全局變量在別的文件中已經定義了,這里只是聲明,而不是定義。
靜態(static)全局變量
在函數外定義,作用范圍被限制在所定義的文件中
不同文件靜態全局變量可以重名,但作用域不沖突
static全局變量的生命周期和程序運行周期一樣,同時staitc全局變量的值只初始化一次
表格對比圖
| 變量類型 | 作用域 | 生命周期 | 存儲位置 | 未初始化 |
|---|---|---|---|---|
| 局部變量 | 函數內部 | 從局部變量創建到函數結束 | 棧區 | 報錯或亂碼 |
| 靜態局部變量 | 函數內部 | 從程序創建到程序銷毀 | 數據區 | 默認為0 |
| 全局變量 | 項目中所有文件 | 從程序創建到程序銷毀 | 數據區 | 默認為0 |
| 靜態全局變量 | 定義所在的文件中 | 從程序創建到程序銷毀 | 數據區 | 默認為0 |
參考:
[1]C基礎講義2018修訂版(黑馬程序員)
