昨天《C與資料結構——概述(一)》的碼字,都是文字,自己看了都糊塗。技術類的東西,文字太多有時候真的不爽。像代碼這種東西,喜歡直觀認識的人常常直接看代碼,才看文字。代碼直觀,文字簡潔。水平太菜,沒辦法簡潔。今只能這樣,先弄個形式:
--------------------------------------------------------------------
# include<stdio.h>
# define uchar unsigned char
uchar c[5]={0,1,2,3,4}; //全域變數
extern int pi=3.14 //extern 全域變數
void main() //main()函數
{
int f(int x);
char i; //局部變數,隱性規則,省掉首碼auto
static int a=2; //靜態局部變數
char *p=0; //地值是可以為0的,其實大於0就行。
}
int f(int x) //資料操作函數 ,有傳回值
{
int a=2;
register long i; f=1 //寄存器變數,
static int c=3;
{
int c; //程式塊裡定義的局部變數
:
;
}
}
--------------------------------------------------------------------
計算內都是玩的都是資料處理,寫演算法也就是對資料區資料的處理步驟。函數即使一些資料操作步驟的集合.現在就說說資料區怎麼初始化,以給後面函數演算法使用。
資料區的初始化,其實就是寫代碼時,弄的常量,變數等,常量我認為是同時給了地值和數值。而變數名給地址,初始化給數值如uchar c[5]={0,1,2,3,4}; ;這是定義也同時初始化了。變數又有全域變數和局部變數之分。靜態變數和自動變數。
全域變數和局部變數——資料區存取權限,所有的演算法指令都可以訪問,訪問一般指讀寫,即取出資料和修改寫回記憶體。
記憶體裡,使用者可以使用的儲存空間有三部分:程式區,靜態儲存區,動態儲存裝置區。
靜態儲存區——全域變數,用static聲明定義的所有函數裡邊的局部變數。說明,以下載錄譚老先生:------------------------------------------“資料分別存放在靜態儲存區和動態儲存裝置區中。全域變數全部存放在靜態儲存區中,在程式開始執行時給全域變數分配儲存區,程式執行完畢就釋放。在程式執行過程中它們佔據固定的儲存單元,而不是動態進行分配和釋放。”
動態儲存裝置區——函數形式參數、自動變數、函數調用時的現場保護和返回地址。這些資料,以函數為中心,都是函數調用時開始分配動態儲存裝置空間,函數結束時釋放這些空間。應用例子:
--------------------------------------------------------------------
void deletelist(list L) //刪除表,即要從儲存空間刪掉
{
position p,tmp; //局部變數,調用時分配臨時記憶體,函數結束自動銷毀,不用擔心遺留問題
p=L->next;
L->next=null; //地值交給p這個臨時小弟,自己清空先撤
while(p!=null)
{
tmp=p->next;
free(p);
p=tmp;
}
}
--------------------------------------------------------------------
從程式執行的角度來理解靜態局部變數和動態局部變數總結,直接用談老先生的了:
(1)靜態局部變數屬於靜態儲存類別,在靜態儲存區配置儲存單元。在程式整個運行期間都不釋放。而自動變數(即動態局部變數)屬於動態儲存裝置類別,占動態儲存裝置區空間而不佔靜態儲存空間,函數調用結束後即釋放。
(2)對靜態局部變數是在編譯時間賦初值的,即只賦初值一次,在程式運行時它們已有初值。以後每次調用函數是不再重新賦初值而只是保留上次函數調用結束時的值。而對自動變數賦初值,不是在編譯時間進行的,而是在函數調用時進行,每調用一次函數重新給一次初值,相當於執行一次指派陳述式。
(3)如在定義局部變數時不賦初值的話,則對靜態局部變數來說,編譯時間自動賦初值0(對數值型變數)或Null 字元(對字元變數)。而對自動變數來說,如果不賦初值則她的值是一個不確定的值,這是由於每次函數調用結束後儲存單元已釋放,下次調用時又重新另分配儲存單元,而所有分配的單元中的值是不確定的。
(4)雖然靜態局部變數在函數調用結束後仍然存在,但其他的函數是不能引用它的。
到這,資料區分析就差不多了,從代碼角度總結一下:
資料區有全域變數,extern變數;局部變數、靜態局部變數,寄存器變數。看代碼,全域只考慮讀寫權限,即範圍,誰可以操作它,靜態儲存區是固定的。局部的資料,就看儲存區,有動態儲存裝置區的和靜態儲存區的,因為讀寫權限是固定的,代碼塊裡面{}。
之所有喜歡C,其實就是因為,學到C51才認識到其強大。嵌入式裡邊,C,C++是王道。至於對某款控制器,或者處理器ARM操作,全域變數是定義好的,如reg51.h檔案裡宏定義了,全域變數對應的21個特殊的寄存器地址。下一篇,改分解對資料區的操作了。