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