文件作用範圍
int total;
int max();
作用範圍:從聲明的位置開始,到文件末尾
函數作用範圍
程序塊作用範圍
函數原型作用範圍
變量的聲明
聲明:給編譯器看的,告知有這麼一個變量,但是此變量是在別的文件裏定義的。方便編譯器做類型檢測
extern int a;//正確的寫法 extern 聲明的關鍵字
定義:爲變量要開闢內存空間
一個全局變量可否被多次定義?不可以
一個全局變量可否被多次聲明?可以
int total;
int max(int ,int);
int main(){
}
這個total 是聲明還是定義呢?如果整個文件裏只有一個total,就是定義,定義沒有賦初始值,如果在別的文件裏也有int toal=10;這個total 就退化成聲明瞭。
對於變量,定義意味着創建,即爲其分配內存
auto自動變量:
所有自動變量的聲明週期就是變量所在的大括號範圍
局部變量的缺省類別
register 自動變量
變量都是在內存當中。如果能把變量放到cpu的寄存器裏面,代碼執行效率會更高。
register int b;
優先分配寄存器,而不分配內存,但不是絕對分配寄存器。因爲cpu的寄存器是按照個數的。arm 37個,x86 17個 。個數太少的時候,是不會分配的。
static(靜態變量):可以用於在程序塊中定義的變量
退出程序庫後依然存在。並保留值
但不改變其作用範圍,既只能在所在的程序塊內被使用。
會自動初始化,缺省值爲0或'\0'
#include <stdlib.h>
int fun(void)
{
static int a = 10; //靜態局部變量,作用域本函數內,聲明週期整個程序運行結束時才釋放,並且a的初始化賦值一次。
printf("%d\n",a);
a++;
return 0;
}
int main(){
fun();
fun();
fun();
return 0;
}
不是在代碼塊中
static int a = 10; //限定了作用域,a只能在本文件內使用,未初始化的全部變量是0
int fun(){
}