




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六章指針
第一節(jié)幾個大家熟悉的指針
第二節(jié)C語言中的指針
第三節(jié)指針和數(shù)組
第四節(jié)編譯預(yù)處理
第五節(jié)文件操作
第六節(jié)進(jìn)階部分知識
陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版第一節(jié)幾個大家熟悉的指針一、旅館客房指針概念假設(shè)某旅館是一個四層樓房,共有客房16間,在某一時刻房間內(nèi)入住旅客的人數(shù)如圖。從圖中可知,101號房間住的是1名男性、102和103號房間住的是2名男性、104號房間住的是1名女性……。我們將房間號稱為地址,住在房間號(地址)內(nèi)的人數(shù)稱為數(shù)據(jù),其屬性有男性或女性、有1名也有2名甚至3名。某旅館某一時刻旅客入住情況陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版旅館住宿情況有以下幾個特點(diǎn):(1)某一個房間號(地址)入住的旅客是個動態(tài)量。(2)某一個房間號(地址)入住的人數(shù)是個動態(tài)量。(3)某一個房間號(地址)人往人的屬性是個動態(tài)量。(4)某一個房間號是一個常量。也就是說,地址(房間號)是一個確定不變的量,而地址內(nèi)儲存的數(shù)據(jù)(旅客)是一個不確定可變的量,當(dāng)然,數(shù)據(jù)的屬性(男、女)也是可變的。如果使用指針的概念來解釋的話,則地址(房間號)就是指針,例如,101這個房間號就是指向一樓的第一個房間位置的指針、203是指向二樓的第三個房間位置的指針。至于指針指向某個位置內(nèi)住的旅客人數(shù)、性別等是不確定的。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版二、幾個日常生活中指針概念1.郵件指針概念我們知道傳統(tǒng)的郵件必須寫明收件人的詳細(xì)地址,即某某省市、某某街道、某某路牌號、某某門牌號等。例如:(1)王小明的地址是:浙江省杭州市文一路128號,王小明的地址就是王小明的指針,該指針是指向浙江省杭州市文一路128號這個確定的地理位置。(2)張國華的地址是:上海市普陀區(qū)文明路818號13幢2單元502室,張國華的地址就是張國華的指針,該指針是指向上海市普陀區(qū)文明路818號13幢2單元502室這個確定的地理位置。至于王小明家當(dāng)時可能有5個人在家,其中二個大人,三個小孩,3男2女,張國華家當(dāng)時可能有4個人在家,其中三個大人,一個小孩,3女1男。也就是指向某家的地址是一個確定的量,而在家人數(shù)是一個不確定的變量。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.取款指針概念我們到銀行去存取款時,銀行工作人員將根據(jù)我們的帳號去找我們的存款單,找到之后在存單上寫入存款、取款的金額。如果使用指針的概念來解釋的話,則帳號就是存單的指針,存款數(shù)是存單的內(nèi)容。例如:(1)劉路碧的銀行帳號是10109595310,其存款金額是25000.00元。那么,劉路碧存單的指針就是10109595310,指針指向存款金額是25000.00元。(2)朱畢生的銀行帳號是1542100100200059985,其存款金額是1458.68元。那么,朱畢生存單的指針就是1542100100200059985,指針指向存款金額是1458.68元。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版四、C語言中的單元地址和單元內(nèi)容通過前幾個例子可以看出,指針通常與地址有關(guān),指針指向某一個地址,該地址內(nèi)必然保存著一些內(nèi)容。那么,C語言中的地址與地址內(nèi)容又是如何的呢?數(shù)據(jù)在內(nèi)存中是如何存儲的,又是如何讀取的呢?1.直接訪問方式圖所示的是三個整型變量i、j、k,編譯時系統(tǒng)分配2000和2001兩個字節(jié)給變量i,2002和2003字節(jié)給變量j,2004和2005字節(jié)給變量k。變量i、j、k三個整型變量的值都是通過地址來進(jìn)行存取的。例如,printf(“%d”,i)的執(zhí)行過程是:根據(jù)變量名與地址的對應(yīng)關(guān)系,找到變量i的地址2000,然后,從由2000開始的兩個字節(jié)中取出數(shù)據(jù)(即變量的值15),將其輸出。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.間接訪問方式在C語言中還有另外一種存取數(shù)據(jù)的方式,即將變量i的地址存放在另一個內(nèi)存單元中,這種存放地址值的變量是一種特殊的變量,我們將它稱為指針變量。假設(shè),定義一個指針變量為i_pointer,該變量被存放在3400開始的兩個字節(jié)單元中,其值是地址2000,即:i_pointer=&i;這時,i_pointer變量的值就是i整型變量所占用存儲單元的首地址2000。所謂“指向”就是通過地址來實(shí)現(xiàn)的。i_pointer中的值為2000,它是i地址,這樣就在i_pointer與i之間建立起一種聯(lián)系,即通過i_pointer能知道i的地址,從而找到變量i的內(nèi)存單元,圖6-3中以箭頭表示這種“指向”關(guān)系。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版第二節(jié)C語言中的指針一、指針變量1.什么是指針變量我們在前幾章中已經(jīng)知道C語言程序所創(chuàng)建的變量,這些變量有數(shù)值變量、字符變量、數(shù)組變量等,它們都被分配在某個確定的存儲單元之中,變量的名字就是該存儲單元首字節(jié)的地址,是地址常量。C通過變量的地址來訪問變量,訪問的方式可分為直接訪問和間接訪問。由于地址指向要訪問的存儲單元,因此,又將地址形象地稱為“指針”,將地址常量稱為“指針”常量。一個變量的地址稱為該變量的“指針”,例如,地址2000是變量i的指針。如果有一個變量專門用來存放另一個變量的地址,則它稱為“指針變量”。圖6-3所示的i_pointer變量就是一個指針變量,該變量的值就是2000(地址)。所以,我們可以說指針變量的值(即指針變量中存放的值)是指針(地址)。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.指針變量的定義我們知道,在C語言中所有的變量在使用之前都必須事先定義,指針作為一個特殊的變量也不例外,必須事先定義,然后再使用。指針變量定義的一般格式:類型標(biāo)識符*指針變量名;例如:float*pointer_1;/*定義pointer_1為指針變量,該指針變量指向?qū)嵭妥兞?/char*pointer_2;/*定義pointer_2為指針變量,該指針變量指向字符型變量*/陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版3.指針變量四要素要使用指針變量,首先要搞清楚指針變量的四個要素,即:指針變量的類型、指針變量所指向的類型、指針變量的值或者叫指針變量所指向的存儲單元、指針本身所占據(jù)的存儲單元。(1)指針變量的類型指的是指針本身的類型,由于指針變量存放的是地址,所以,指針變量本身的類型是整型。(2)指針變量所指向的類型指的是類型標(biāo)識符。類型標(biāo)識符指的是定義的指針變量是指向何種數(shù)據(jù)類型,例如,類型標(biāo)識符為float,則表示定義的指針變量只能指向?qū)崝?shù)型的變量;類型標(biāo)識符為char,則表示定義的指針變量只能指向字符型的變量;類型標(biāo)識符為int,則表示定義的指針變量只能指向整型變量。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(3)指針變量的值指的是指針?biāo)赶虻拇鎯卧?,該存儲單元稱為地址。例如,某一個變量的存儲單元地址為2024,則指針變量的值就是2024,該值為一個整型值。(4)指針變量本身所占據(jù)的存儲單元指的是指針變量用來存放地址時所需占用的位置大小。在32位計(jì)算機(jī)系統(tǒng)中,該變量本身占4個字節(jié)的存儲單元。(5)指針變量名前的標(biāo)識符“*”表示該變量為指針變量。在定義指針變量時,標(biāo)識符“*”必須寫上。(6)一個指針變量只能指向同一個類型的變量,不能忽而指向一個整型變量,忽而指向?qū)嵭妥兞?。也就是說,只有同一類型變量的地址才能放到指向該類型變量的指針變量中。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版二、運(yùn)算符&和*1.運(yùn)算符&運(yùn)算符&表示取地址,&i的運(yùn)算結(jié)果是一個指針,指針?biāo)赶虻念愋褪莍的類型,指針?biāo)赶虻牡刂?,就是i的地址。2.運(yùn)算符*運(yùn)算符*稱為指針運(yùn)算符,有時也可稱為“間接訪問”運(yùn)算符。&i為變量i的地址,如果有語句pointer_1=&i;該語句表示將i變量的地址賦給指針變量,而*pointer_1則表示該指針變量所指向的是i變量地址的值。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版三、指針變量的引用通過以上幾個程序的分析,我們已知道指針變量的用法了,下面我們再次對指針變量作進(jìn)一步的分析。假設(shè)pointer_1是一個指針變量,則pointer_1的值是一個地址值,引用指針變量pointer_1所指向的變量的值,應(yīng)表示為“*pointer_1”。表達(dá)式“pointer_1=&a”的作用是:將a的地址送給pointer_1,使pointer_1指向a。表達(dá)式“*pointer_1=a”的作用是:將a的值送給pointer_1所指向的變量。請看以下一個程序段:chara[5]={‘A’,’B’,’C’},li=‘x’,*pointer_1=a,*pointer_2;pointer_1=pointer_1+3;*pointer_1=li;pointer_2=&li;*pointer_2=*pointer_1+1;在執(zhí)行過程中,各變量的當(dāng)前值如下:陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(1)執(zhí)行賦值語句前①*pointer_1=a,表示將a字符數(shù)組首地址的值賦給*pointer_1。②li=‘x’,表示li字符變量的初始值為x。③*pointer_2指針變量的值不確定。
以上各變量的當(dāng)前值如圖6-6所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(2)執(zhí)行pointer_1=pointer_1+3時,指針pointer_1指向a[3],其它變量情況仍不變,如圖6-7所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(3)執(zhí)行*pointer_1=li時,表示將li字符變量的值賦給指針變量pointer_1所指向的地址,如圖6-8所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(4)執(zhí)行pointer_2=&li時,表示將li的地址賦給pointer_2指針變量,pointer_2所指向的是li的地址,如圖6-9所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(5)執(zhí)行*pointer_2=*pointer_1+1時,表示將指針變量所指向a[3]變量的值x再向下一個字符,即是‘y’,如圖6-10所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版四、指針運(yùn)算指針是一種數(shù)據(jù)類型,具有無符號整數(shù)值。對于指針類型數(shù)據(jù),可以進(jìn)行下列的運(yùn)算:(1)指針變量與整數(shù)的加法運(yùn)算、減法運(yùn)算。(2)同一數(shù)組中各元素的地址之間作關(guān)系運(yùn)算、相減。(3)賦值運(yùn)算。1.指針變量與整數(shù)的加法和減法運(yùn)算當(dāng)指針變量與一個整數(shù)進(jìn)行相加、減運(yùn)算時,例如:P++、P--、P+i、P-i、p--=i等。C語言規(guī)定,一個指針變量加或減一個整數(shù)并不是簡單的加或減一個整數(shù),而是將該指針變量的地址和它所指向的變量所占的內(nèi)存字節(jié)數(shù)相加或相減。即:p+i代表地址計(jì)算,表示指針在內(nèi)存空間向下移動,用式子p+c*i來計(jì)算,其中c為系數(shù),根據(jù)數(shù)據(jù)類型長度而定,對整型數(shù)據(jù)C=2;實(shí)型數(shù)據(jù)C=4;字符型數(shù)據(jù)C=1。這樣才能保證*(P+i)指向P下面的第i個元素,它才有意義。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.同一數(shù)組中各元素的地址之間作關(guān)系運(yùn)算、相減指向不同類型數(shù)據(jù)的指針之間不可以作關(guān)系運(yùn)算,因?yàn)椋煌瑪?shù)組被分配了不同的存儲空間,所以兩個指向不同數(shù)組中元素的指針類型數(shù)據(jù)之間作關(guān)系運(yùn)算是沒有任何意義的。兩個指向同一數(shù)組中元素的指針類型之間作關(guān)系運(yùn)算,可以得出它們是否指向同一個數(shù)組元素的結(jié)論。作減法運(yùn)算時,可以計(jì)算出在它們所指向的這兩個數(shù)組元素之間有多少個數(shù)組元素。例如,圖6-12所示的數(shù)組i[6]在內(nèi)存中存放數(shù)據(jù)的情況:(1)作關(guān)系運(yùn)算兩個指針P1和P2指向同一個數(shù)組元素,P1指向數(shù)組前面的元素,P2指向數(shù)組后面的元素,則P1<P2,或者說,表達(dá)式“P1<P2”的值為1(真),而“P2<P1”的值為0(假)。注意,如果P1和P2不是指向同一數(shù)組則比較是無意義的。(2)作減法運(yùn)算圖中有2個指針變量P1和P2分別指向同一個數(shù)組的不同元素,則兩個指針變量值之差是兩個指針之間的元素個數(shù)。即:P1指向i[1],P2指向i[4],則P2-P1=4-1=3,也就是說,P2-P1的值是3,即有3個元素。注意,如果P1+P2,則無實(shí)際意義。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版3.指針類型數(shù)據(jù)之間的賦值運(yùn)算指針類型數(shù)據(jù)之間的賦值運(yùn)算,要求指針變量與表達(dá)式必須是同一類型。指針的類型,由以下兩個因素決定的:(1)指向不同類型數(shù)據(jù)的指針,其類型是不同的。例如:inta=2345,*P;P=&a;(將變量a的地址賦給P,*p的類型為整型)floatarray[10],*P;p=array;(將數(shù)組array首地址賦給P,*P的類型為實(shí)型)p=&array[i];(將數(shù)組array第i個元素的地址賦給P)p1=P2;(將P2的值賦給P1,P1和P2都是指針變量)(2)不同“級”的指針類型數(shù)據(jù),其類型也是不同的。對指針類型數(shù)據(jù)最多可作的間接引用次數(shù)稱為指針數(shù)據(jù)的級。一維數(shù)組的名,是一級指針常量;二維數(shù)組的名,是二級指針常量,在類型聲明語句的變量名列表中,指針變量名前綴字符“*”的個數(shù)是指針變量的級。例如:inta,**b,***c;以上語句是聲明b是指向整型類型數(shù)據(jù)的2級指針變量,c是指向整型類型數(shù)據(jù)的3級指針變量。多級指針就是指向指針的指針,在一般情況下,多級指針的用法很少會超過2級,否則,容易造成對程序的理解錯誤,使程序難于閱讀。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版4.指針變量空值指針變量可以有空值,即該指針變量不指向任何變量,可以有這樣的語句:P=NULL;實(shí)際上NULL是整數(shù)0,它使P的存儲單元中所有二進(jìn)位均為0,也就是使P指向地址0的單元。系統(tǒng)保證使該單元不作其它用,即不存放任何有效的數(shù)據(jù),有效數(shù)據(jù)的指針不指向0單元,實(shí)際上是先定義NULL,即:
#defineNULL0...P=NULL;這樣定義了一個指針為空值。應(yīng)注意,P的值為NULL與未對P賦值是兩個不同的概念。前者是有值的(值為0),不指向任何變量,而后者P是未賦值并不等于P無值,只是它的值是一個不確定的值,也就是P實(shí)際上可能指向一個事先未指定的單元,這種情況是很危險的。因此,在引用指針變量之前應(yīng)對它賦值。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版五、指向指針的指針我們已經(jīng)知道,一個指針變量可以指向一個類型變量的,即可以指向一個整型變量,或一個實(shí)型變量,或一個字符變量,當(dāng)然,也可以指向一個指針型變量。這應(yīng)該是可以理解的,因?yàn)?,一個指針變量既然可以指向另一個變量,那么,被指向的變量當(dāng)然可以是任一類型的,包括指針變量。定義一個指向指針的指針變量的方法如下:格式:<類型標(biāo)識符>**<指針變量名>其中:①<類型標(biāo)識符>指的是指向指針的指針?biāo)赶蜃兞康念愋?;?*表示指向指針的指針變量標(biāo)識符,該標(biāo)識符的功能是該變量必須存放的是指針變量的地址值;③<指針變量名>與前相同,表示指針變量的名稱。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版例如:int**P;該語句是定義一個指針變量P,該P(yáng)是指向另一個指針變量,是一個二級指針。由于指針運(yùn)算符“*”是按自右而左順序結(jié)合的,所以,以上的定義相當(dāng)于:int*(*P);從這一形式可以看出,(*P)是指針變量的形式,它外面的“*”表示P指向的又是一個指針變量,int表示該指針變量指向的是整型變量,如圖6-13所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版第三節(jié)指針和數(shù)組指針和數(shù)組主要講解指針在數(shù)組中的應(yīng)用,C語言中的數(shù)組的存取表面上可以使用下標(biāo)的方式,實(shí)際上是使用指針的方式,指針在C語言中最大的應(yīng)用就是用在數(shù)組上。數(shù)組能用指針表示盡量使用指針表示,因?yàn)?,用下?biāo)方法表示的數(shù)組,當(dāng)編譯時系統(tǒng)仍然要將它轉(zhuǎn)換成指針表示。當(dāng)然,有時用指針表示不太方便的時候,仍可采用下標(biāo)表示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版一、一維數(shù)組的指針表示1.用指針變量表示一維數(shù)組我們已知道,一個數(shù)組名代表它的起始地址。那么,數(shù)組中各元素的地址又如何計(jì)算的呢?如果有一個數(shù)組i如圖6-15所示,i的值就是數(shù)組的起始地址(設(shè)為2000),假設(shè)已定義i為實(shí)型數(shù)組,則i[0]的地址為2000,如果定義P為指針變量,那么,i[1]的地址可以用P+1表示,也就是說“P+1指向i數(shù)組的下標(biāo)為1的元素”,同樣,P+a是i[a]的地址,當(dāng)a的值為2時,指針P+2指向i[2]元素的地址。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版實(shí)際地址是,P+a中的a要乘上數(shù)組元素所占的字節(jié)數(shù),即P+a×4(實(shí)型數(shù)據(jù)所占的字節(jié)數(shù))=2000(為P的地址)+2×4=2008。同理,P+3的地址為2012,P+4的地址為2016,以此類推……。也就是說,P+a和&i[a]是相等的,都是i[a]的地址。要注意的是:i[a]與&i[a]兩者的含義是不相同的,i[a]是i數(shù)組第a個元素的值,而&i[a]是i[a]元素的地址。所以引用數(shù)組的方法可以有以下兩種:(1)下標(biāo)法:即i[a],其中a為下標(biāo)。(2)地址法:即*(P+a)。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版二、二維數(shù)組的指針表示1.用指針變量表示二維數(shù)組我們已知道,一維數(shù)組名代表了該數(shù)組的起始地址,也就是該一維數(shù)組的第一個元素的起始地址,也就是說,它是一個指向所代表的數(shù)組即指向其起始單元的指針。由于一維數(shù)組被定義后,其起始地址也就被確定了,所以數(shù)組名實(shí)際上是一個指針常數(shù)。一維數(shù)組的任何一個元素的地址,都可以用其數(shù)組名加上一個偏移量來表示。這個位移量的單位不是字節(jié),而是數(shù)組元素的大小。如果對整型數(shù)組,則位移單位為2個字節(jié),對實(shí)型數(shù)組,位移單位為4個字節(jié),對字符數(shù)組,位移單位為1個字節(jié)等。下面的幾組表達(dá)式是等價的。那么對于一個二維數(shù)組來說,指針又是如何表示的呢?下面我們以一個3×4的整型數(shù)組a[3][4]為例,分析用指針指向二維數(shù)組中各元素。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版實(shí)際上,一個二維數(shù)組就是一張二維數(shù)表,表格中的行是二維數(shù)組的第一個下標(biāo),表格中的列是二維數(shù)組的第二個下標(biāo)。二維數(shù)組a[3][4]就是一張3行4列的表格,如表6-2所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版二維數(shù)組a[3][4]在內(nèi)存的情況如圖6-17所示,a的值就是二維數(shù)組的起始地址(設(shè)為2020),也就是a[0][0]的地址為2020。a實(shí)際上是一個二級int型指針,其中a[i]是一個一級int型指針。由此類推,一個m維數(shù)組的數(shù)組名,對基本類型來說是一個n級指針。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版三、指針與字符串我們已知道,字符串是存放在字符數(shù)組中的,因此,為了對字符串的操作,可以定義一個字符數(shù)組,也可以定義一個字符指針。1.用字符數(shù)組來實(shí)現(xiàn)2.用字符指針來實(shí)現(xiàn)3.應(yīng)用舉例字符串指針變量的定義說明與指向字符變量的指針變量說明是相同的。只能按對指針變量的賦值不同來區(qū)別。對指向字符變量的指針變量應(yīng)賦予該字符變量的地址。例如:charc,*p=&c;/*p是一個指向字符變量c的指針變量。*/char*s="CLanguage";/*s是指向字符串的指針變量,把字符串的首地址賦予s。*/
陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版四、指針數(shù)組1.什么是指針數(shù)組我們已經(jīng)知道,在一個數(shù)組里,如果每個元素的類型都是整型的,則該數(shù)組稱為整型數(shù)組;如果每個元素的類型都是字符型的,則該數(shù)組稱為字符數(shù)組……。那么,如果,數(shù)組中的每個元素的類型都是指針型的,則該數(shù)組就稱為指針數(shù)組。也就是說,指針數(shù)組是用來存放一批指針即存放一批地址的。引入指針數(shù)組的目的在于使用字符串的操作,請看下面一個例子:例如,有若干個字符串需要存儲在一個數(shù)組中,按我們已學(xué)過的方法,可以使用一個字符型的一維數(shù)組來存放這個字符串,那么,如果有5個字符串,最長的字符串長度為14個字符,則應(yīng)定義一個5×15的二維數(shù)組如圖6-20所示。
陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.指針數(shù)組定義格式:<類型標(biāo)識>*<數(shù)組名>[數(shù)組長度說明]其中:(1)類型標(biāo)識指的是指針數(shù)組指向的類型。(2)數(shù)組名指的是指針數(shù)組的名稱。(3)數(shù)組長度說明指的是指針數(shù)組元素的個數(shù),它是一個選擇項(xiàng),用于可根據(jù)需要進(jìn)行選擇。例如:int*p[8]/*定義指向整型數(shù)據(jù)的指針數(shù)組*/char*p1[6]/*定義指向字符型數(shù)據(jù)的指針數(shù)組*/陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版第四節(jié)編譯預(yù)處理編譯預(yù)處理指的是在編譯前對源程序進(jìn)行的一些預(yù)加工,預(yù)處理由編譯系統(tǒng)中的預(yù)處理程序按源程序中的預(yù)處理命令進(jìn)行的。在C語言源程序中,除了完成程序功能的聲明語句、執(zhí)行語句外,還可以使用編譯預(yù)處理命令,編譯預(yù)處理命令是以“#”標(biāo)識符開始的字符,尾部不得加分號,一行不得書寫一條以上的編譯預(yù)處理命令。常用的編譯預(yù)處理命令有宏定義、文件包含等。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版一、宏定義宏定義的一般格式為:格式:#define宏名宏體其中:宏名為標(biāo)識符,宏體為一段文本。功能:預(yù)處理時,將把程序中該宏定義之后的所有宏名用宏體替換。我們以前介紹過的符號常數(shù)的定義就是這種宏定義的一種應(yīng)用。例如:#definePI3.1415926這表示指定標(biāo)識符PI來代替“3.1415926”這個字符串,在編譯預(yù)處理時,把程序中在該命令以后的所有PI都用“3.1415926”代替。在這里宏名就是PI,宏體就是3.1415926。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版在使用過程中應(yīng)注意以下幾個問題:(1)宏名一般習(xí)慣使用大寫的字母表示,以致與變量名相區(qū)別。(2)使用宏名代替一個字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。(3)宏定義時系統(tǒng)不作語法檢查,也就是說不管定義的含義是否正確,一律只作簡單的置換。(4)宏定義一般須寫在程序最前面,因?yàn)樗皇荂語言的語句,所以宏定義未尾不加分號。(5)如果需要對已作宏定義的字符串恢復(fù)原狀,可以使用#undef命令來終止宏定義的作用域。(6)在進(jìn)行宏定義時,可以引用已定義的宏名,可以層層替換。(7)在程序中只要與宏名相同的字母都作簡單的置換,但如果用雙引號括起來的則不會完成替換工作。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版二、帶參數(shù)的宏定義有時候在宏名后面可以帶參數(shù),其格式如下:
#define宏名(形參列表)宏體功能:在編譯預(yù)處理時,將程序中該命令后所有與宏名相同的文本用宏體進(jìn)行置換,但在置換時宏體中的形參要用相應(yīng)的實(shí)參置換。書寫#defin命令行時應(yīng)注意的幾個問題:(1)宏名與宏體之間應(yīng)以空格分隔,所以宏名中不允許含有空格。(2)宏名不允許使用引號括起來。(3)若一行內(nèi)不能寫完時,可以在本尾使用反斜杠表示續(xù)行。(4)對帶參宏定義,宏體及其各個形參應(yīng)該用圓括號括起來。(5)宏定義一般寫在源程序的最前面,但也可以寫在程序的任何位置處,但必須是寫在使用宏之前。(6)已定義的宏可以用命令#undef來取消。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版三、文件包含1.文件包含格式和功能文件包含的一般格式為:格式:#include<包含文件名>或:#include“包含文件名”功能:在編譯源程序前,用包含文件的內(nèi)容置換該預(yù)處理命令,也就是從磁盤按包含文件名讀取文件,然后,將它寫入到源程序中該預(yù)處理命令處,使它成為源程序中的一部分。實(shí)際上是宏定義的延伸。例如,#include“abc.c”當(dāng)執(zhí)行源程序后,系統(tǒng)將當(dāng)前目錄下的abc.c程序嵌入到源程序之中,成為源程序中的一部分。以上兩種格式中,其區(qū)別在于,使用“<>”符號括起來的格式時,編譯系統(tǒng)將按照系統(tǒng)設(shè)定的標(biāo)準(zhǔn)目錄搜索該文件,使用““””符號括起來的格式時,編譯系統(tǒng)將首先在當(dāng)前目錄中查找該文件,再按標(biāo)準(zhǔn)目錄查找直到查找到該文件為止。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.常用標(biāo)準(zhǔn)包含文件由C語言系統(tǒng)提供的包含文件,都以“.h”為文件的擴(kuò)展名。表6-3所示的是87ANSIC(以及ISOC)中提供的15個包含文件。每個函數(shù)庫都與某個包含文件相對應(yīng)。當(dāng)調(diào)用標(biāo)準(zhǔn)函數(shù)庫時,應(yīng)注意把相對應(yīng)的包含文件用#include命令將它包含到所引用的程序中來,當(dāng)然,確實(shí)不需要時,也可以不使用它,但這樣做往往是不安全的。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版第五節(jié)文件操作一、文件概念1.C語言文件概念計(jì)算機(jī)中的任何信息資料包括系統(tǒng)軟件和應(yīng)用軟件,都是以文件的形式儲存在磁介質(zhì)的外部設(shè)備上的。例如,用計(jì)算機(jī)語言編制的程序、用戶起草的文稿、數(shù)據(jù)和其他一些信息等,都可以作為文件存儲在磁盤上。操作系統(tǒng)是以文件為對象對數(shù)據(jù)進(jìn)行管理的,而且對文件的管理非常靈活,用戶如果想找到保存在外部磁介質(zhì)上的數(shù)據(jù),可以先按文件名找到所指定的文件,然后,再從該文件中讀取數(shù)據(jù)。當(dāng)然,用戶也可以向外部磁介質(zhì)上存儲數(shù)據(jù)。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.設(shè)備保留名C語言中文件名的規(guī)定與用法與DOS中文件名的規(guī)定與用法相同。DOS中除了一般文件名之外,還有專門為設(shè)備設(shè)定了保留名(這些保留名都不能用于建立文件),它們有:(1)CON,代表輸入設(shè)備的鍵盤和輸出設(shè)備的顯示器。(2)AUX或COM1,代表第一個異步通訊適配器的端口。(3)COM2,代表第二個異步通訊適配器的端口。(4)LPT1或PRN,代表第一個并行打印機(jī)。(5)LPT2和LPT3,代表第二和第三個并行打印機(jī)。(6)NUL,代表虛擬的外部設(shè)備名,用于測試運(yùn)行。當(dāng)作輸入設(shè)備時,立即產(chǎn)生文件結(jié)束,當(dāng)作輸出設(shè)備時,則模擬寫操作,實(shí)際并無數(shù)據(jù)輸出。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版3.文件的處理方法在C語言中有以下兩種對文件的處理方法:(1)緩沖文件系統(tǒng),指的是系統(tǒng)為每一個文件自動在內(nèi)存區(qū)域開辟一個緩沖區(qū),這個區(qū)域?qū)iT為數(shù)據(jù)開辟一個臨時的過渡空間作為傳送數(shù)據(jù)的媒介。如果從內(nèi)存向磁盤輸出數(shù)據(jù),則先將數(shù)據(jù)送到內(nèi)存的緩沖區(qū),待裝滿后再一起送到磁盤去;如果從磁盤向內(nèi)存讀入數(shù)據(jù),則一次從磁盤文件將一批數(shù)據(jù)輸入到緩沖區(qū),充滿后再從緩沖區(qū)逐個將數(shù)據(jù)送到程序數(shù)據(jù)區(qū),如圖6-25所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版一般情況下,用緩沖區(qū)文件系統(tǒng)來處理文本文件,使用緩沖區(qū)文件系統(tǒng)的輸入輸出稱為標(biāo)準(zhǔn)輸入輸出(標(biāo)準(zhǔn)I/O)。標(biāo)準(zhǔn)的I/O提供4種讀寫文件的方法,它們是:①讀寫一個字符的方法,使用fgetc和fputc函數(shù)。②讀寫一個字符串的方法,使用fgets和fputs函數(shù)。③格式化讀寫的方法,使用fscanf和fprintf函數(shù)。④讀寫一個“記錄”(或稱為數(shù)據(jù)塊)的方法,使用fread和fwrite函數(shù)。(2)非緩沖文憑系統(tǒng),指的是系統(tǒng)不自動開辟確定大小的緩沖區(qū),而是由程序自己為每個文件設(shè)定緩沖區(qū)。一般情況下,用非緩沖區(qū)文件系統(tǒng)來處理二進(jìn)制文件。使用非緩沖區(qū)文件系統(tǒng)的輸入輸出稱為系統(tǒng)級輸入輸出(系統(tǒng)I/O)。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版二、文件打開與關(guān)閉1.文件打開文件的打開指的是程序把要操作的文件的一些信息通知給操作系統(tǒng),使用戶的程序和操作系統(tǒng)之間建立一種聯(lián)系。這種聯(lián)系使操作系統(tǒng)知道用戶所需打開的文件名,讀數(shù)據(jù)還是寫數(shù)據(jù)等內(nèi)容。如果是讀數(shù)據(jù),則需要先確定此文件是否存在,并將讀寫當(dāng)前位置設(shè)定為文件開頭;如果是寫文件,則檢查原來是否有相同的文件名,若有則將該文件刪除,然后,再新建立一個文件,如果原來無同名的文件,則將讀寫當(dāng)前位置設(shè)定為文件開頭,以便從文件開頭寫入數(shù)據(jù)。格式:
fopen(文件名,文件使用方式);功能:打開一個文件名,并對該文件進(jìn)行操作。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版例如:(1)
fopen(“student”,”r”);表示需要打開的是student的文件名,對文件使用方式為“只讀方式”。(2)fopen(“st_score”,”wb”);表示需要打開的是st_score的文件名,對文件使用方式為“只寫方式”。文件的使用方式如表6-4所示。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版從表6-4中可知,后6種方式是在前6種方式的基礎(chǔ)上再加一個“+”號形成的,其區(qū)別是由一個單一的讀或?qū)懙姆绞綌U(kuò)展為又能讀又能寫的方式。例如,“r”和“r+”都是為輸入打開一個文本文件,其中“r”的使用方式是只能對該文件進(jìn)行讀操作,而“r+”的使用方式是既可對該文件進(jìn)行讀操作,又能對該文件進(jìn)行寫操作。又如,“W”“W+”都是為輸出打開一個文本文件,其中“W”的使用方式是只能對該文件進(jìn)行寫操作,而“W+”的使用方式既可對該文件進(jìn)行讀操作又能對該文件進(jìn)行寫操作。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.文件關(guān)閉文件關(guān)閉指的是在使用完一個文件后須將該文件關(guān)閉,以免造成數(shù)據(jù)的丟失。“關(guān)閉”就是使文件指針變量不指向該文件,也就是文件指針變量與文件“脫鉤”,此后不能再通過該指針對原來與其相聯(lián)系統(tǒng)的文件進(jìn)行讀寫操作了。除非再重新打開該文件,使該指針變量重新指向該文件。格式:
fclose(文件指針變量);功能:關(guān)閉文件指針指向的文件。例如,fclose(fp);表示關(guān)閉文件,也就是通知系統(tǒng),將此指針指向的文件關(guān)閉,并釋放相應(yīng)的文件信息區(qū)(結(jié)構(gòu)體變量)。這樣,原來的指針變量不再指向該文件,此后也就不能通過此指針來訪問該文件了。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版三、文件順序讀寫打開一個文件以后,就可以對該文件進(jìn)行讀寫操作了,常用的讀寫操作方法有以下幾種函數(shù)。1.字符輸入函數(shù)fgetc格式:ch=fgetc(fp);功能:從fp指針指向文件的當(dāng)前讀寫位置讀入一個字符,并將該字符的ASCII碼值賦給變量ch。若讀到^Z,則返回EOF(即-1)。讀完一個字符后,文件的讀寫位置向后移動一個字節(jié)。2.字符輸出函數(shù)fputc格式:fputc(ch,fp);功能:在fp指針指向文件的當(dāng)前讀寫位置寫入一個字符。若寫入字符成功,則函數(shù)返回值為該字符的ASCII碼值;若寫入字符不成功,則返回值為EOF。寫完一個字符后,文件的讀寫位置向后移動一個字節(jié)。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版3.字符串輸入函數(shù)fgets格式:fgets(str,n,fp);功能:從fp指針指向的文件讀取n-1個字符,并把它放到字符數(shù)組str中,在str數(shù)組最后自動加一個“\0”結(jié)束標(biāo)志符。如果讀入n-1個字符完成之前遇到換行符“\n”或文件結(jié)束符EOF,即結(jié)束讀入。函數(shù)的返回值為str首地址或NULL。4.字符串輸出函數(shù)fputs格式:fputs(str,fp);功能:在fp指針指向的文件寫入一個字符串str(不包括字符串結(jié)束標(biāo)志“\0”)。函數(shù)的返回值為所輸出末字符的ASCII碼,若向文件輸出的字符串不成功,則函數(shù)的返回值為0。向文件輸出字符串后,文件讀寫位置移動到所寫入的字符串之后。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版四、數(shù)據(jù)塊讀寫函數(shù)1.讀數(shù)據(jù)塊函數(shù)格式:fread(buffer,size,count,fp);其中:buffer是一個指針,它是讀入數(shù)據(jù)的存放地址。size是要讀取的字節(jié)數(shù)。count是要進(jìn)行讀取多少個size字節(jié)的數(shù)據(jù)項(xiàng)。fp是文件型指針。功能:從fp指針指向的文件中讀取count個size字節(jié)的數(shù)據(jù)項(xiàng),并存放在buffer地址中。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.寫數(shù)據(jù)塊函數(shù)格式:fwrite(buffer,size,count,fp);其中:buffer是一個指針,它是寫入數(shù)據(jù)的存放地址。size是要讀取的字節(jié)數(shù)。count是要進(jìn)行寫入多少個size字節(jié)的數(shù)據(jù)項(xiàng)。fp是文件型指針。功能:在fp指針指向的文件中寫入count個size字節(jié)的數(shù)據(jù)項(xiàng),并存放在buffer地址中。如果文件是以二進(jìn)制形式打開的,則以上兩個函數(shù)可以讀寫任何類型的信息,例如:(1)fread(f,4,2,fp);則表示從fp所指向的文件中讀入2次(每次4個字節(jié))數(shù)據(jù),存儲到數(shù)組f中。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(2)如果有一個如下的結(jié)構(gòu)類型:
struct
student_type{charname[10];intnum;intage;charaddr[30];}stu[40];結(jié)構(gòu)體數(shù)組stu有40個元素,每一個元素用來存放一個學(xué)生的數(shù)據(jù)(包括姓名、學(xué)號、年齡、地址)。假設(shè)學(xué)生的數(shù)據(jù)已存放在磁盤文件中,可以用下面的語句讀入40個學(xué)生的信息。
for(i=0;i<40;i++)
fread(&stu[i],sizeof(structstudent_type),1,fp);同樣,也可以使用以下語句將內(nèi)存中的學(xué)生數(shù)據(jù)輸出到磁盤文件中去。
for(i=0;i<40;i++)
fwrite(&stu[i],sizeof(structstudent_type),1,fp);如果fread或fwrite調(diào)用成功,則函數(shù)返回值為count的值,即輸入或輸出數(shù)據(jù)的完整個數(shù)。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版五、文件隨機(jī)讀寫1.文件的定位要對文件進(jìn)行隨機(jī)讀寫操作,必須先確定文件的記錄指針,文件的記錄指針確定可以使用fseek函數(shù)來達(dá)到。(1)fseek函數(shù)格式:fseek(文件類型指針,位移量,起始點(diǎn));其中:“超始點(diǎn)”指的是以什么地方為基準(zhǔn)進(jìn)行移動,一般是使用數(shù)字來代表的。①數(shù)字0表示文件開始處。②數(shù)字1表示文件位置指針的當(dāng)前指向。③數(shù)字2表示文件末尾?!拔灰屏俊敝傅氖且浴捌鹗键c(diǎn)”為基點(diǎn)向前移動的字節(jié)數(shù)。如果它的值為負(fù)數(shù),則表示向后移動,反之表示從文件開頭向文件末尾移動的方向。位移量的數(shù)據(jù)類型為loong型,這樣當(dāng)文件長度很長時,位移量仍在loong型數(shù)據(jù)表示范圍之內(nèi)。功能:將位置指針以起始點(diǎn)為基準(zhǔn)開始,移動到位移量所表示的位置處。例如:fseek(fp,10L,0);/*將位置指針移動到離文件開始處10個字節(jié)處。*/fseek(fp,-20L,1);/*將位置指針從當(dāng)前位置向后移動20個字節(jié)*/fseek(fp,-50L,2);/*將位置指針從文件末尾后移50個字節(jié)。*/有了fseek函數(shù)后,就可以隨機(jī)讀寫磁盤文件中的信息了。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版(2)ftell函數(shù)格式:i=ftell(fp);功能:返回磁盤文件的當(dāng)前位置的指向。如果ftell(fp)返回值為-1則表示出錯(例如不存在此文件等)。例如,i=ftell(fp);/*將fp指針指向的文件中位置指針的當(dāng)前指向賦給i*/if(i==-1L)/*判斷i的值是否為-1*/
printf(“出錯\n”);/*如果是-1,則表示出錯了*/(3)rewind函數(shù)格式:rewind(fp);功能:使用位置指針重新返回到文件的開頭處,此函數(shù)無返回值。陳孟建鄒玉金熊傳光編著電子工業(yè)出版社出版2.文件的出錯檢測在大多數(shù)的C語言系統(tǒng)中,都沒有具有明確的出錯信息返回,因此,在調(diào)試程序過程中,需要使用一些檢查文件出錯的函數(shù)來人為地進(jìn)行檢測,從而使程序的調(diào)試工作做到心中有數(shù),不致于化很多的精力去檢查那些低級錯誤
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Module7 Unit1 He spent about twenty-one hours in space(教學(xué)設(shè)計(jì))-2023-2024學(xué)年外研版(三起)英語六年級下冊
- 華北理工大學(xué)冀唐學(xué)院《研究型建筑設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西國際商務(wù)職業(yè)學(xué)院《計(jì)算機(jī)組成原理理論》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱鐵道職業(yè)技術(shù)學(xué)院《班級活動的組織》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧民族師范高等??茖W(xué)校《機(jī)電系統(tǒng)設(shè)計(jì)與控制》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州東華職業(yè)學(xué)院《海洋生物技術(shù)綜合實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 南昌大學(xué)科學(xué)技術(shù)學(xué)院《新編大學(xué)生安全教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 河北科技師范學(xué)院《西方財務(wù)會計(jì)雙語》2023-2024學(xué)年第二學(xué)期期末試卷
- 共青科技職業(yè)學(xué)院《學(xué)前兒童保育學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 陜西理工大學(xué)《數(shù)字信號處理》2023-2024學(xué)年第二學(xué)期期末試卷
- 社區(qū)意識形態(tài)工作2025年度工作計(jì)劃
- 2025年山東省濟(jì)南廣播電視臺招聘30人歷年管理單位筆試遴選500模擬題附帶答案詳解
- DG-TJ 08-2048-2024 民用建筑電氣防火設(shè)計(jì)標(biāo)準(zhǔn)
- 2025年中智集團(tuán)招聘筆試參考題庫含答案解析
- 黑龍江省哈爾濱市南崗區(qū)2024-2025學(xué)年九年級上學(xué)期期末考試英語試題(含答案)
- 殘疾人就業(yè)培訓(xùn)
- Photoshop+2024學(xué)習(xí)手冊:第1課認(rèn)識與操作基礎(chǔ)
- 《不同血流限制訓(xùn)練方案對膝關(guān)節(jié)損傷運(yùn)動員下肢功能的影響》
- 藥品經(jīng)營企業(yè)(批發(fā)和零售)面臨的風(fēng)險點(diǎn)和應(yīng)對措施
- 北師大版(2024新版)七年級上冊數(shù)學(xué)期末模擬測試卷(含答案)
- 無人機(jī)組裝與調(diào)試 課件 項(xiàng)目1任務(wù)1 多旋翼無人機(jī)飛行平臺組裝調(diào)試
評論
0/150
提交評論