《計算機等級考試二級語言程序設計第13章編譯預處理和動態(tài)存儲分配》由會員分享,可在線閱讀,更多相關《計算機等級考試二級語言程序設計第13章編譯預處理和動態(tài)存儲分配(11頁珍藏版)》請在裝配圖網上搜索。
1、單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,本章重點,13.1,編譯預處理,13.2,動態(tài)存儲分配,第,13,章 編譯預處理和動態(tài)存儲分配,咖淄氈眩救痛鎬蚊謊甜餐電垃喧免媒獰不撐措娥志蟹缸逗肺裳決盞愁倔胚計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,13.1,編譯預處理,13.1.1,宏替換,1,無參數的宏定義,宏定義是指用一個指定的標識符(即名字)來代表程序中一個字符串。它的一般形式為:,define,宏名字符串 或,define,宏名,例如:,define
2、 SIZE 10,標識符,SIZE,稱為宏名,此命令執(zhí)行后,預處理程序對源程序中的所有名為,SIZE,的標識符用,10,來替換,此過程就稱為,“,宏替換,”,。,枕蟹況蘿胳提狐港巋蹦蛾樂餌星骯白翔凸氏擴涕腺吊丈戲魁界釩婪稱腸生計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,其中,,“,”,表示這是一條預處理命令,,“,define,”,為宏定義命令,,“,宏名,”,為一個合法的標識符,,“,字符串,”,可以是常數、表達式或語句,甚至可以是多條語句。,說明:,(,1,)宏定義與變量定義含義不同,它只作字符替
3、換,并不分配內存空間,也不能認為是賦值。,(,2,)宏定義是用宏名代替一個字符串,是一種機械的置換,不作任何語法檢查。,(,3,)宏定義結尾不必加分號。如果加了分號,則被認為是字符串的一部分,即在預處理時,分號也被一起替換。,(,4,)替換文本中也可以包含已定義過的宏名。,協(xié)酉果蒸霹誓辦涼迸設堯攻浦疑俐拜殿淆八奉恍燎躊頓項庫硫酬燥者囪掠計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,(,5,)宏名的有效范圍從定義之后到本源文件結束,出了這個文件,宏名便失卻了作用,(,6,)若宏名出現(xiàn)在一對雙引號中,將不會
4、產生宏替換。例如,如果,ADD,是已經定義的宏名,則不能用與它相關的替換文本來替換,printf(,“,ADD,”,),中的,ADD,。,(,7,)宏定義還可以定義運算符、表達式,甚至可以把輸出格式語句作為宏定義。,(,8,)替換文本并不替換用戶標識符中的成分。,眨貢疤棺縫履祁珠欄韶染富廷潮撓涕賓忙訖搶請嫩褲輔爺厚芋咱宣籠咖廁計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,2,帶參數的宏定義,宏定義除了允許定義符號常量外,還可以用于定義帶有參數的宏。在宏定義中的參數稱為形式參數,簡稱形參;在宏調用中的參數
5、稱為實際參數,簡稱實參。帶參數的宏定義一般形式為:,define,宏名(形參表)字符串,在編譯預處理時,程序中凡是帶實參的宏,一律按,#define,命令行中指定的字符串從左到右進行替換。,熾睫僅飛始邦腺嬰玄幻厚贏榜冠炮中婉裴菊望誅肛藥寫財紡吳慷諧飾首嬰計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,13.1.2,文件包含,在用,C,語言開發(fā)程序時,我們可以把一些宏定義按照功能分別存入不同的文件中,當我們需要使用某類宏定義時,就無需在程序中重新去定義,而只要把這些宏定義所在的文件包含在程序的開頭就可以了。
6、,文件包含是指一個源程序文件將另一個指定文件的全部內容包含進來,即將另一個文件包含到本文件之中。這一過程通過預處理命令,#include,來完成。文件包含預處理語句的一般形式為:,include,或,include,“,包含文件,”,叫躇渤爍豪郎式擊堡女磷庭陸野怨寄職姑罪刁貼瓷機蒲棗鱗卞如違媽佳健計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,其中,包含文件名是磁盤中文本文件的名字。例如:,#include,或,#include stdio.h,在編譯時,預編譯程序將用指定文件中的內容來替換此命令行。,1
7、3.2,動態(tài)存儲分配,此前,我們用于存儲數據的變量和數組都必須在說明部分進行定義。,C,編譯程序通過定義語句了解它們所需存儲空間的大小,并預先為其分配適當的內存空間。這些空間一經分配,在變量或數組的生存期內是固定不變的。所以這種方式也稱為,“,靜態(tài)存儲分配,”,。,蔽波收按靜蘸疚誨隊閱遲番斂凄樣像撿努贏廢嬸撈晶嬰筑揖馱遼踐晌卓舊計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,C,語言中還有一種,“,動態(tài)存儲分配,”,的內存空間分配方式,在程序執(zhí)行期間需要空間來存儲數據時,通過申請分配指定的內存空間;當有閑
8、置不用的空間時,可以隨時將其釋放,由系統(tǒng)另作它用。用戶可以通過調用,C,語言提供的標準庫函數來實現(xiàn)動態(tài)分配,從而得到指定數目的內存空間或釋放指定的內存空間。,13.2.1 malloc,函數和,free,函數,1,malloc,函數,malloc,函數的調用形式為:,malloc,(,size,),其中,size,的類型為,unsigned int,,函數返回值類型為,void*,。,保孟擯轅輿料陸我吐拱嗅降葡曲瑯瞥乾攔摟隆謝團滑惶基胞罕仿斯照見托計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,2,fre
9、e,函數,free,函數調用的形式為:,free(p),p,是指針變量,必須指向由動態(tài)分配函數,malloc,分配的地址,,free,函數將指針,p,所指的存儲空間釋放,使這部分空間可以由系統(tǒng)重新支配。此函數沒有返回值。,捶恿韻策臃揭助隕腑飾矩杖榨拼釣筍哦滬跟齊用常艷犁窖境脊敵嘉禮震劈計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,13.2.2 calloc,函數,calloc,函數的調用形式為:,calloc(n,size);,n,和,size,的類型都為,unsigned int,型。其返回值的類型為
10、,void*,。,calloc,函數用來給,n,個同一類型的數據項分配連續(xù)的存儲空間。每個數據項的長度為,size,個字節(jié),若分配成功,函數返回存儲空間的首地址。否則返回空。由調用,calloc,函數所分配的存儲單元,系統(tǒng)自動設置初值為,0,。,葡揍蜀父乞取孽腔身于莆偶抽捂陪遙血呂樞懲吉墑尸著袁斧主括這嬸賜甜計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,例如:,char *ps;,ps=(char*)calloc(10,sizeof(char);,以上語句開辟了,10,個連續(xù)的,char,類型的存儲單元,由,ps,指向存儲單元的首地址。每個存儲單元可以存放一個字符。,顯然,使用,calloc,函數開辟的動態(tài)存儲單元相當于開辟了一個一維數組。函數的第一個參數決定了一維數組的大小;第二個參數決定了數組元素的類型。函數的返回值就是數組的首地址。,使用,calloc,函數開辟的動態(tài)存儲單元,同樣用,free,函數釋放。調用形式:,free(p),爸啡糧賽推繼要牲狹焉溺饞伺奎背絹筷哩罩綜畝恐鰓葛策磋珊礁暮庭逸找計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配計算機等級考試二級語言程序設計第,13,章 編譯預處理和動態(tài)存儲分配,