版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、2024/3/17,第十三章 編譯預(yù)處理和動(dòng)態(tài)存儲(chǔ)分配,甘肅聯(lián)合大學(xué) 電信學(xué)院 曹曉麗,2024/3/17,第一節(jié) 編譯預(yù)處理,編譯預(yù)處理:C編譯程序?qū)源程序進(jìn)行編譯之前,由編譯預(yù)處理程序?qū)幾g預(yù)處理命令進(jìn)行處理的過程 C語言中,凡是以“#”開頭的行,都稱為“編譯預(yù)處理”命令行,每行的末尾不得用“;”號(hào)結(jié)束,以區(qū)別于C語言中的語句、定義和說明語句。它們可以出現(xiàn)在程序的任何一行的開始位置,作用域是從出現(xiàn)點(diǎn)到本文件末尾。,2
2、024/3/17,第一節(jié) 編譯預(yù)處理,C語言的預(yù)處理命令有: #define、#undef、#include、#if、#else、#elif、#endif、#ifdef、#ifndef、#line、#pragma、#error。本章將重點(diǎn)介紹#define和#include命令行的應(yīng)用,2024/3/17,第一節(jié) 編譯預(yù)處理,一、宏替換宏替換是用#define指定的預(yù)處理1.不帶參數(shù)的宏定義1> 不帶參數(shù)的宏定義命
3、令行形式#define 宏名 替換文本 或#define 宏名,2024/3/17,第一節(jié) 編譯預(yù)處理,如: #define size 100 以上標(biāo)識(shí)符size是宏名,是用戶定義的標(biāo)識(shí)符,不得與程序中的其它名字相同。在編譯時(shí),在此命令之后,預(yù)處理程序?qū)υ闯绦蛑械乃忻麨閟ize的標(biāo)識(shí)符用100三個(gè)字符來替換,這個(gè)替換過程稱為“宏替換”。這是一種簡單的字符替換,不進(jìn)行任何計(jì)算。所以不要認(rèn)為“size等于
4、整數(shù)100”。,2024/3/17,第一節(jié) 編譯預(yù)處理,例:#define PI 3.1415926#define R 3.0double circle(){ return 2.0*PI*R;}double area(){ return PI*R*R;},2024/3/17,第一節(jié) 編譯預(yù)處理,經(jīng)過預(yù)處理后將形成以下源文件:double circle(){ return 2.0*3.1415926*3.0;
5、}double area(){ return 3.1415926*3.0*3.0;},2024/3/17,第一節(jié) 編譯預(yù)處理,使用宏替換的好處是:提高程序可讀性易修改性好,若用宏替換將半徑R修改為5,則只需修改1處,否則需修改3處 #define命令行可以不包含“替換文本”,這種情況下僅說明標(biāo)識(shí)符“被定義”。,2024/3/17,第一節(jié) 編譯預(yù)處理,2> 替換文本中可以包含已定義過的宏名例如:#defi
6、ne PI 3.14 #define ADDPI (PI+1) #define TWO-ADDPI (2*ADDPI) 程序中若有表達(dá)式:x=TWO-ADDPI/2,則表達(dá)式將成為x=(2*(3.14+1))/2。 若第二、三行的替換文本不加括號(hào),直接寫成PI+1和2*ADDPI,則以上表達(dá)式被替換為x=2*3.14+1/2,所以,使用宏替換時(shí)一般要求把替換文
7、本用()括起來,2024/3/17,第一節(jié) 編譯預(yù)處理,3> 若宏定義在一行中寫不下時(shí),在行尾加“\”表示要續(xù)行,若“\”前或下一行的開頭有空格,則在宏替換時(shí)也加入空格如:#define LEAP-YEAR year%4\&& year&100!=0||year%400==0第一列4> 同一宏名不能重復(fù)定義,除非兩個(gè)宏定義命令行完全一致,但這沒有意義,2024/3/17,第一節(jié) 編
8、譯預(yù)處理,5> 替換文本不能替換雙引號(hào)中與宏名相同的字符串。如:#define YES 1則不能用1來替換printf(“YES”);當(dāng)中的YES6> 替換文本不能替換用戶標(biāo)識(shí)符中的成分 如:#define YES 1 int YESORNO; 此處YES不替換7> 宏名通常用大寫字母,但非規(guī)定8> 宏定義一般寫在程序開頭9> 宏名不能用雙引號(hào)引起來 #de
9、fine “YES” 1 將不進(jìn)行宏替換,2024/3/17,第一節(jié) 編譯預(yù)處理,2. 帶參數(shù)的宏定義1> 帶參數(shù)的宏定義命令行形式#define 宏名(形參表) 替換文本 如; #define MU(x,y) ((x)*(y)) 宏名 宏 a=MU(5,2) a=((5)*(2)) b=6/MU(a+3,a) b=6/((
10、a+3)*(a)) 宏名和(必須緊挨著,不得留空格;各形參之間用逗號(hào)隔開;“替換文本”中通常應(yīng)該包含形參。,,,2024/3/17,第一節(jié) 編譯預(yù)處理,2> 同一宏名不能重復(fù)定義,除非兩個(gè)宏定義命令行完全一致 在預(yù)編譯時(shí),編譯預(yù)處理程序用“替換文本”來替換宏,并用對(duì)應(yīng)的實(shí)參來替換“替換文本”中的形參3> 替換帶參數(shù)的宏名時(shí),一對(duì)圓括號(hào)必不可少。圓括號(hào)中的實(shí)參應(yīng)與形參個(gè)數(shù)相同,若有多個(gè)參數(shù),他們之間用逗號(hào)隔
11、開。,2024/3/17,第一節(jié) 編譯預(yù)處理,4> 替換文本中的形參和整個(gè)表達(dá)式應(yīng)該用括號(hào)括起來#define MU(x,y) (x)*(y)b=6/MU(a+3,a) b=6/(a+3)*(a)#define MU(x,y) x*yb=6/MU(a+3,a) b=6/a+3*a,2024/3/17,第一節(jié) 編譯預(yù)處理,5> 宏替換和函數(shù)調(diào)用有相似之處,但宏替換對(duì)參數(shù)無類型要求,
12、整型也可,實(shí)型也可;函數(shù)調(diào)用中,對(duì)不同類型的參數(shù),需定義不同的函數(shù)。6> 宏替換是在編譯時(shí)由預(yù)處理程序完成的,不占運(yùn)行時(shí)間,但需占用大量空間;函數(shù)調(diào)用是程序運(yùn)行時(shí)進(jìn)行的,需占運(yùn)行時(shí)間,但不需占用大量空間。7> 宏替換中,實(shí)參不能替換雙引號(hào)中的形參例 : #define LET(x,v) x=v #define PRT(f,i) printf(f,i),2024/3/17,第一節(jié) 編譯預(yù)處理,P1
13、82 EX13.1#define MIN(x,y) (x)<(y)?(x):(y)main(){ int i,j,k; i=10; j=15; k=10*(i)<(j)?(i):(j); printf(“%d\n”,k);} 結(jié)果:15,2024/3/17,第一節(jié) 編譯預(yù)處理,3. 終止宏定義 1> 形式:#undef 宏名 2> 提前終止宏定義的作用域 如:#
14、define PI 3.1415 main() … #undef PI …PI 無效,定義域已結(jié)束無定義,2024/3/17,第一節(jié) 編譯預(yù)處理,二.文件包含 在用C語言開發(fā)程序時(shí),我們把一些宏定義按照功能分別放入不同的文件中。當(dāng)我們需要使用某類宏定義時(shí),就無須在程序中重新定義,而只要把這些宏定義所在的文件包含在程序的開頭就可以了(當(dāng)然文件中還可以包含其他內(nèi)容)
15、 所謂文件包含是指在一個(gè)文件中,去包含另一個(gè)文件的全部內(nèi)容。C語言中用#include命令行來實(shí)現(xiàn)文件包含的功能。,2024/3/17,第一節(jié) 編譯預(yù)處理,#include命令行的形式如下: #include “文件名” 首先在源文件所在的目錄內(nèi)查找指定的包含文件,如果找不到,再按照系統(tǒng)指定的標(biāo)準(zhǔn)方式到有關(guān)目錄去尋找或 #include 系統(tǒng)將直接按照系統(tǒng)指定的標(biāo)準(zhǔn)方式到有關(guān)目錄去尋找。 在預(yù)編
16、譯時(shí),預(yù)編譯程序?qū)⒂弥付ㄎ募械膬?nèi)容來替換命令行。,2024/3/17,第一節(jié) 編譯預(yù)處理,說明:1> #include命令行通常書寫在文件開頭,故有時(shí)把包含文件稱為頭文件,頭文件名可以由用戶指定,擴(kuò)展名不一定用“h”,但這是指自定義的頭文件2> (被)包含文件中,一般包含一些公用的#define命令行、外部說明(如:extern)或?qū)Γ◣欤┖瘮?shù)的原型說明。如:stdio.h3>(被)包含文件修改后,對(duì)包含該文件
17、的源程序必須重新編譯連接,2024/3/17,第一節(jié) 編譯預(yù)處理,4> 在一個(gè)程序中,允許有任意多個(gè)#include命令行5> (被)包含文件中還可以包含其它文件,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,我們在前面講述表示符的存儲(chǔ)類型時(shí)曾講過,計(jì)算機(jī)的內(nèi)存可分為四個(gè)區(qū):程序代碼區(qū)、靜態(tài)數(shù)據(jù)區(qū)、棧區(qū)、堆區(qū)。程序代碼區(qū)用于存放C語言中各函數(shù)的程序代碼;靜態(tài)存儲(chǔ)區(qū)用來存放全局變量及靜態(tài)局部變量(靜態(tài)類);棧區(qū)用來存放自動(dòng)類別的
18、局部變量(自動(dòng)類)和函數(shù)調(diào)用時(shí)的返回地址。無論是靜態(tài)變量還是自動(dòng)變量,在變量的生存期內(nèi)它們所占的存儲(chǔ)空間都是固定不變的,所以這種分配方式為靜態(tài)存儲(chǔ)分配。,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,C語言中還有一種稱為“動(dòng)態(tài)存儲(chǔ)分配”的內(nèi)存分配方式。 即在程序執(zhí)行期間需要存儲(chǔ)空間來存儲(chǔ)數(shù)據(jù)時(shí),通過“申請”分配指定的內(nèi)存空間。當(dāng)有空閑不用的空間時(shí),可以隨時(shí)將其釋放,由系統(tǒng)另作它用。而這些被動(dòng)態(tài)分配的空間正是內(nèi)存的堆區(qū),這個(gè)區(qū)域由C語言提供的
19、標(biāo)準(zhǔn)庫函數(shù)進(jìn)行管理,從而得到指定數(shù)目的內(nèi)存空間或釋放指定的內(nèi)存空間。,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,ANSI C為動(dòng)態(tài)分配,系統(tǒng)提供了四個(gè)庫函數(shù):malloc、calloc、free和realloc,需用包含頭文件stdlib.h 一.malloc函數(shù)和free函數(shù)1. malloc函數(shù) 它的作用是在內(nèi)存開辟指定大小的存儲(chǔ)空間,并將此存儲(chǔ)空間的首地址作為函數(shù)值返回,函數(shù)的原型是: void *malloc(un
20、signed int size),2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,含義: 分配size個(gè)字節(jié)的存儲(chǔ)區(qū),返回一個(gè)指向存儲(chǔ)區(qū)首地址的基類型為void的地址值(存儲(chǔ)區(qū)首地址)。不規(guī)定指向任何具體類型的數(shù)據(jù),若想將這個(gè)地址值賦給其它類型的指針變量,需用強(qiáng)制類型轉(zhuǎn)換的方法把void指針轉(zhuǎn)換成所需類型;若沒有足夠的內(nèi)存單元供分配,函數(shù)返回空(NULL),2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,如: short *pi
21、; pi=(short *)malloc(sizeof(short)); if(pi!=NULL) *pi=6; 由動(dòng)態(tài)分配得到的存儲(chǔ)單元沒有名字,只靠指針變量來引用。一旦指針指向改變,原存儲(chǔ)單元及其所存數(shù)據(jù)都將無法引用。通過malloc分配的存儲(chǔ)單元中沒有確定的初值。,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,在動(dòng)態(tài)分配存儲(chǔ)空間時(shí),若不能確定數(shù)據(jù)類型所占的字節(jié)數(shù),可以使用sizeof運(yùn)算符來求得。sizeo
22、f(類型名)是一個(gè)整型表達(dá)式,其值為此類型變量所占的字節(jié)數(shù)。 例如: pi=(int *)malloc(sizeof(int)); 這是一種常用的格式,此時(shí)由系統(tǒng)指定指定類型所占的字節(jié)數(shù)。 那么,如果想分配能存放8個(gè)整型變量的空間,該怎么調(diào)用呢? pi=(int *)malloc(8*sizeof(int)); 這是一種常用格式。,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,2. free函數(shù)
23、 函數(shù)的調(diào)用形式:free(p) 這里指針變量p必須指向由函數(shù)malloc或calloc分配的地址。free函數(shù)將釋放指針p所指的存儲(chǔ)空間,使這部分空間可以由系統(tǒng)重新支配。函數(shù)無返回值。,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,二.calloc函數(shù) 其函數(shù)原型為:void *calloc(unsigned int n,unsigned int size)如:calloc(n,size) 其函
24、數(shù)用來給n個(gè)大小為size的同一類型的數(shù)據(jù)項(xiàng)分配連續(xù)的存儲(chǔ)空間。若分配成功返回首地址,如果需賦值,則要進(jìn)行強(qiáng)制類型轉(zhuǎn)化;若分配失敗,返回空,2024/3/17,第二節(jié) 動(dòng)態(tài)存儲(chǔ)分配,如: char *ps; ps=(char *)calloc(10,sizeof(char)); 主要用于開辟連續(xù)的存儲(chǔ)空間存放數(shù)組元素,其中第一個(gè)參數(shù)決定了一維數(shù)組的數(shù)組元素個(gè)數(shù);第二個(gè)參數(shù)決定了數(shù)組元素的類型。函數(shù)的返回值為數(shù)組的首地址,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 第2章_數(shù)據(jù)存儲(chǔ)預(yù)處理
- 第六章 函數(shù)、存儲(chǔ)類和預(yù)處理程序
- 三存儲(chǔ)管理動(dòng)態(tài)不等長存儲(chǔ)資源分配算法
- 多核處理器的事務(wù)存儲(chǔ)模型的模擬和編譯實(shí)現(xiàn).pdf
- c語言程序設(shè)計(jì)_2 第10章 編譯預(yù)處理
- 分配存儲(chǔ)
- SAR實(shí)時(shí)處理器預(yù)處理和轉(zhuǎn)置存儲(chǔ)技術(shù)的研究與實(shí)現(xiàn).pdf
- [學(xué)習(xí)]樊媛媛c語言程序設(shè)計(jì)09-編譯預(yù)處理
- 基于Hadoop的Web日志存儲(chǔ)及預(yù)處理優(yōu)化研究.pdf
- 操作系統(tǒng)課程設(shè)計(jì)---動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理
- 基于動(dòng)態(tài)任務(wù)分配策略的主動(dòng)存儲(chǔ)系統(tǒng).pdf
- 快遞站點(diǎn)貨柜存儲(chǔ)空間動(dòng)態(tài)分配優(yōu)化研究.pdf
- 動(dòng)態(tài)分區(qū)主存的分配和回收
- 原料乳的驗(yàn)收和預(yù)處理
- 基于嵌入式系統(tǒng)的在線動(dòng)態(tài)簽名的數(shù)據(jù)采集和預(yù)處理.pdf
- 分布式存儲(chǔ)系統(tǒng)上數(shù)據(jù)劃分技術(shù)和編譯實(shí)現(xiàn).pdf
- 入水預(yù)處理
- 并行數(shù)據(jù)處理中間件存儲(chǔ)分配策略研究.pdf
- 大數(shù)據(jù)的存儲(chǔ)和處理研究.pdf
- 靈活預(yù)處理GPBiCG和并行BiCG方法.pdf
評(píng)論
0/150
提交評(píng)論