cprimer學(xué)習(xí)筆記_第1頁(yè)
cprimer學(xué)習(xí)筆記_第2頁(yè)
cprimer學(xué)習(xí)筆記_第3頁(yè)
cprimer學(xué)習(xí)筆記_第4頁(yè)
cprimer學(xué)習(xí)筆記_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C Primer 始于2014-11-12文字顏色說(shuō)明:1) 正文中的黑色粗字體表示首次看時(shí),覺(jué)得比較重要的文字2) 正文中的紅色表示,復(fù)習(xí)筆記后添加的知識(shí)點(diǎn)ANSI(American National Standards Institute) 美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)第13章 文件輸入輸出13.1 和文件進(jìn)行通信13.1.1 文件是什么l C將文件看成是連續(xù)的字節(jié)序列,其中每一個(gè)字節(jié)都可以單獨(dú)的讀?。?3.1.2 文本視圖和二進(jìn)制視圖l 二進(jìn)制視圖中,每一個(gè)字節(jié)都可以為程序所訪問(wèn);l 文本視圖中,不同的操作環(huán)境(操作系統(tǒng)),程序所看到的內(nèi)容和文件有可能不同(例如行尾的標(biāo)志)13.1.4 標(biāo)準(zhǔn)文件C語(yǔ)

2、言提供3種標(biāo)準(zhǔn)文件。標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出; 標(biāo)準(zhǔn)輸入:getchar()、gets()、scanf() 標(biāo)準(zhǔn)輸出:putchar()、puts()、printf()13.2 標(biāo)準(zhǔn)I/O13.2.1 檢查命令行參數(shù)l return 0 與exit(0)的區(qū)別: 最初調(diào)用的main函數(shù)中二者是一樣的,main在一個(gè)遞歸程序中時(shí),exit()會(huì)終止程序,而return只返回遞歸的前一級(jí)。 在main函數(shù)以外的函數(shù)中調(diào)用exit也會(huì)終止程序13.2.2 fopen()函數(shù)fopen(參數(shù)1,參數(shù)2) 參數(shù)1:是一個(gè)地址(指針或數(shù)組),數(shù)組中包含要打開(kāi)的文件名 參數(shù)2:是一個(gè)字符串,指定打開(kāi)

3、文件的模式。有以下7大類模式1) “r” 打開(kāi)一個(gè)文本文件,可以讀取文件2) “w” 打開(kāi)一個(gè)文本文件,可以寫(xiě)入文件,先將文件長(zhǎng)度截為0。若該文件不存在,先創(chuàng)建3) “a” 打開(kāi)一個(gè)文本文件,向已有文件的尾部追加內(nèi)容。若不存在,先創(chuàng)建4) “r+” 打開(kāi)一個(gè)文本文件,可以進(jìn)行更新,也可以讀取和寫(xiě)入5) “w+” 打開(kāi)一個(gè)文本文件,可以進(jìn)行更新(讀取和寫(xiě)入)。先將文件長(zhǎng)度截為0,沒(méi)有則先創(chuàng)建6) “a+” 打開(kāi)一個(gè)文本文件,可以進(jìn)行更新(讀取和寫(xiě)入),讀取整個(gè)文件,寫(xiě)入時(shí)只能向尾部追加內(nèi)容 返回:fopen函數(shù)返回一個(gè)文件指針fp,這個(gè)指針指向FILE(stdio.h中定義的一種派生類型),fp

4、指向關(guān)于文件的信息的數(shù)據(jù)包。如果不能打開(kāi)文件則返回一個(gè)空指針NULL。13.2.3 getc()函數(shù)和putc()函數(shù)l getc() ch = getc(fp) 表示從fp指定的文件中獲得一個(gè)字符;l putc(參數(shù)1,參數(shù)2)putc(ch,fpout) 表示將字符ch寫(xiě)入到FILE指針fpout指定的文件中13.2.4 2文件結(jié)尾l 從文件中讀取數(shù)據(jù)的程序需要在到大文件的結(jié)尾時(shí)停止。到達(dá)文件結(jié)尾時(shí),getc()函數(shù)會(huì)返回一個(gè)特殊值EOF13.2.5 fclose()函數(shù)l Fclose(fp)關(guān)閉由指針fp指定的文件,同時(shí)根據(jù)需要刷新緩沖區(qū)。13.2.6 標(biāo)準(zhǔn)文件指針l 包含3個(gè)標(biāo)準(zhǔn)文件

5、指針:stdin(標(biāo)準(zhǔn)輸入)、stdout(標(biāo)準(zhǔn)輸出)、stderr(標(biāo)準(zhǔn)錯(cuò)誤)13.3 一個(gè)簡(jiǎn)單的文件壓縮程序13.4 文件I/O每個(gè)I/O函數(shù)都存在一個(gè)相似的文件I/O函數(shù)。文件I/O函數(shù)需要使用一個(gè)FILE指針來(lái)為這些函數(shù)指定要操作的文件。13.4.1 fprintf()和fscanf()函數(shù)l fprintf()和fscanf() fprintf/fscanf(參數(shù)1,參數(shù)2,參數(shù)3) 參數(shù)1為FILE指針;例如fprintf(fp,“%s”,words)其中fp是FILE指針,words是數(shù)組名稱;l rewind(參數(shù)1) 使程序回到文件開(kāi)始處,參數(shù)1必須是一個(gè)文件指針;13.4.

6、2 fgets()和fputs()函數(shù)l fgets(參數(shù)1,參數(shù)2,參數(shù)3) fgets(buf,max,fp) 參數(shù)1:一個(gè)地址,用于存儲(chǔ)輸入值的地址 參數(shù)2:一個(gè)整數(shù),輸入字符串的最大長(zhǎng)度 參數(shù)3:一個(gè)文件指針,這個(gè)指針指向要讀取的文件 返回值:返回傳遞給它的地址值,當(dāng)遇到EOF時(shí),返回NULL fgets()函數(shù)讀取到它遇到的第1個(gè)換行字符的后面,或者讀取比字符串的最大長(zhǎng)度少一個(gè)的字符,或者讀取到文件結(jié)尾。然后fgets()向末尾添加一個(gè)空字符以構(gòu)成一個(gè)字符串。如果fgets在達(dá)到字符最大數(shù)目之前讀完一整行,它將在字符串的空字符前添加一個(gè)換行符以表示一行結(jié)束。l Fputs(參數(shù)1,參

7、數(shù)2) 把字符串地址指針?biāo)傅淖址畬?xiě)入指定的文件。(與fgets相比,沒(méi)有寫(xiě)入的長(zhǎng)度,因?yàn)樽址Y(jié)束符) 參數(shù)1:一個(gè)地址,是要寫(xiě)入到文件的字符串的地址 參數(shù)2:一個(gè)文件指針,指向要寫(xiě)入字符串的文件l fgets保留了換行符,fputs不會(huì)添加換行符;13.5 隨機(jī)存取13.5.1 fseek()和ftell() 文件的定位函數(shù)l fseek(參數(shù)1,參數(shù)2,參數(shù)3) 參數(shù)1:一個(gè)文件指針,指向被搜索的文件 參數(shù)2:一個(gè)long類型的值。表示從起始點(diǎn)開(kāi)始的偏移量(偏移的字節(jié)數(shù)),正表示前移,負(fù)表示后移,0表示保持不動(dòng) 參數(shù)3:模式,決定偏移量的起始點(diǎn),一般分為SEEK_SET、SEEK_

8、CUR、SEEK_END 返回值:正常則返回0,不正常則返回-1l ftell(參數(shù)1) ftell函數(shù)為long型函數(shù),返回文件的當(dāng)前位置(1個(gè)long型數(shù)據(jù))。通過(guò)返回距離文件起始處的字節(jié)數(shù)目來(lái)確定文件的位置。13.5.4 fgetpos()和fsetpos()處理較大文件的定位函數(shù)。13.6 標(biāo)準(zhǔn)I/O內(nèi)幕l 執(zhí)行一次fopen函數(shù): 打開(kāi)一個(gè)文件 建立一個(gè)(讀寫(xiě)模式下兩個(gè))緩沖區(qū) 創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu)(包含文件和緩沖區(qū)相關(guān)數(shù)據(jù)),包括以下內(nèi)容 錯(cuò)誤指示器 文件結(jié)尾指示器 指向緩沖區(qū)起始處的指針 文件標(biāo)示符 計(jì)數(shù)器:記錄實(shí)際復(fù)制到緩沖區(qū)中的字節(jié)數(shù) 返回一個(gè)指向該結(jié)構(gòu)的指針13.7 其他標(biāo)準(zhǔn)I

9、/O函數(shù)13.7.4 二進(jìn)制I/O:fread()和fwrite()數(shù)據(jù)用二進(jìn)制形式存入文件,沒(méi)有數(shù)字形式到字符形式的轉(zhuǎn)換。存入的數(shù)據(jù)更精確。13.8 知識(shí)總結(jié)比較常用的共12 個(gè)1) fopen(參數(shù)1,參數(shù)2) 文件地址,模式2) fclose(參數(shù)1) 文件指針3) getc(參數(shù)1) 文件指針4) putc(參數(shù)1,參數(shù)2) 寫(xiě)入文件的字符,文件指針5) fgets(參數(shù)1,參數(shù)2,參數(shù)3) 存入字符串的地址,字符長(zhǎng)度,文件指針6) fputs(參數(shù)1) 文件指針7) fprintf(參數(shù)1,參數(shù)2,參數(shù)3) 文件指針,輸出格式,字符串地址8) fscanf(參數(shù)1,參數(shù)2,參數(shù)3)

10、文件指針,輸入格式,字符串地址9) fseek(參數(shù)1,參數(shù)2,參數(shù)3) 文件指針,偏移量,起始點(diǎn)模式10) ftell(參數(shù)1) 文件指針11) fread(參數(shù)1,參數(shù)2,參數(shù)3)12) fwrite(參數(shù)1,參數(shù)2,參數(shù)3)第14章 結(jié)構(gòu)和其他數(shù)據(jù)格式14.1 實(shí)例問(wèn)題:創(chuàng)建圖書(shū)目錄P37914.2 建立結(jié)構(gòu)聲明Struct bookchar title41;char author31;float value;struct book library; 把library定義為一個(gè)book結(jié)構(gòu)設(shè)計(jì)的結(jié)構(gòu)變量;l 其中struct是關(guān)鍵字,表示接下來(lái)是一個(gè)結(jié)構(gòu);l Book:是一個(gè)可選的標(biāo)記l

11、 花括號(hào)內(nèi)是結(jié)構(gòu)成員列表;14.3 定義結(jié)構(gòu)變量l 結(jié)構(gòu)有兩個(gè)意思:一是結(jié)構(gòu)設(shè)計(jì),一是結(jié)構(gòu)變量 結(jié)構(gòu)設(shè)計(jì):告訴編譯器如何表示數(shù)據(jù),但并沒(méi)讓計(jì)算機(jī)為數(shù)據(jù)分配空間 結(jié)構(gòu)變量:編譯器使用book模板為該變量分配空間;l 聲明結(jié)構(gòu)和定義結(jié)構(gòu)變量的過(guò)程可以合并,如下:Structchar title41;char author31;float value;library;但是如果要多次使用一個(gè)結(jié)構(gòu)模板,就必須使用標(biāo)記;14.3.1 初始化結(jié)構(gòu)l 使用一個(gè)用花括號(hào)括起來(lái)、逗號(hào)分隔的初始化項(xiàng)目列表進(jìn)行初始化。如下Struct book library“C Primer”,“Stephen Prata”,60

12、.00;14.3.2 訪問(wèn)結(jié)構(gòu)成員l 訪問(wèn)結(jié)構(gòu)的成員:用結(jié)構(gòu)成員運(yùn)算符點(diǎn)(.)例gets(library.title)14.3.3 結(jié)構(gòu)的指定初始化項(xiàng)目l 指定初始化:用點(diǎn)運(yùn)算符和成員名來(lái)表示具體的元素;例:struct book gift = .value = 25.99, .author = “James Broadfool”, .title = “Rue for the Toad”;1) 可以按任何順序指定初始化2) 只初始化某個(gè)成員3) 對(duì)特定的成員,最后一次賦值是它實(shí)際的值14.4 結(jié)構(gòu)數(shù)組14.4.1 聲明結(jié)構(gòu)數(shù)組Struct book library10;Library本身不是結(jié)

13、構(gòu)名,它是元素類型為struct book結(jié)構(gòu)的數(shù)組名。14.4.2 表示結(jié)構(gòu)數(shù)組的成員library1.valuelibrary2.title5 第2個(gè)結(jié)構(gòu)的title成員的第6個(gè)字符14.5 嵌套結(jié)構(gòu)結(jié)構(gòu)的某一個(gè)或多個(gè)成員也是結(jié)構(gòu)。訪問(wèn)嵌套結(jié)構(gòu)的成員的方法:應(yīng)用兩次點(diǎn)運(yùn)算符。#include #define LEN 20const char *msg5 = /定義字符常量數(shù)組 Thank you for the wonderful evening,You certainly prove that a ,is a specail kind of guy.We must get togethe

14、r,over a delicious,and have a few laughs;struct nameschar firstLEN;char lastLEN;struct guystruct names handle;char favfoodLEN;char jobLEN;float income;int main(void)struct guy fellow = /初始化結(jié)構(gòu)Even, Villard ,grilled salmon,personality coach,58112.00;printf(Dear %s,nn,fellow.handle.first);printf(%s%sn,

15、msg0,fellow.handle.first);/訪問(wèn)嵌套結(jié)構(gòu)的成員printf(%s%sn,msg1,fellow.job);printf(%sn,msg2);printf(%s %s %sn,msg3,fellow.favfood,msg4);printf(n%40s%sn,See you soon,);printf(%40s%sn,Shalala);return 0;14.6 指向結(jié)構(gòu)的指針14.6.1 聲明和初始化結(jié)構(gòu)指針l 聲明:struct guy *him; 意味著指針him現(xiàn)在可以指向任何現(xiàn)有的guy類型的結(jié)構(gòu)。l 初始化:him = & fellow0;14.6.2 使用

16、指針訪問(wèn)成員l 初始化后的him,有兩種方式訪問(wèn)指針成員 him - income; (*him).income 二者完全相同14.7 向函數(shù)傳遞結(jié)構(gòu)信息函數(shù)與結(jié)構(gòu)的傳遞包括3種方式:傳遞結(jié)構(gòu)成員、傳遞結(jié)構(gòu)地址、傳遞結(jié)構(gòu);14.7.1 向函數(shù)傳遞結(jié)構(gòu)成員14.7.2 向函數(shù)傳遞結(jié)構(gòu)地址#include #define FUNLEN 50struct fundschar bankFUNLEN;double bankfund;char saveFUNLEN;double savefund;double sum (const struct funds *);/聲明函數(shù),其中參數(shù)為指向結(jié)構(gòu)的指針int

17、 main (void)struct funds stan =Garlic-Melon Bank,3024.72,Luckys Savings and Loan,9237.11;printf(Stan has a total of $%.2f.n,sum (&stan);/結(jié)構(gòu)的地址必須用&return 0;double sum (const struct funds *money)return (money-bankfund + money-savefund); /通過(guò)指針直接訪問(wèn)原結(jié)構(gòu)stan14.7.3 向函數(shù)傳遞結(jié)構(gòu)#include #define FUNLEN 50struct fu

18、ndschar bankFUNLEN;double bankfund;char saveFUNLEN;double savefund;double sum (struct funds moolah);/聲明函數(shù),參數(shù)為結(jié)構(gòu) int main (void)struct funds stan =Garlic-Melon Bank,3024.72,Luckys Savings and Loan,9237.11;printf(Stan has a total of $%.2f.n,sum (stan);/將結(jié)構(gòu)傳遞給函數(shù) return 0;double sum ( struct funds moola

19、h)return (moolah.bankfund + moolah.savefund); /會(huì)創(chuàng)建一個(gè)和stan一樣的結(jié)構(gòu)14.7.4 結(jié)構(gòu)的一些特性1) 結(jié)構(gòu)的成員、結(jié)構(gòu)的地址、結(jié)構(gòu)可作為函數(shù)的參數(shù)向函數(shù)傳遞信息2) 賦值:兩個(gè)結(jié)構(gòu)類型相同,可將一個(gè)結(jié)構(gòu)賦值給另外一個(gè)結(jié)構(gòu)3) 把一個(gè)結(jié)構(gòu)(已經(jīng)初始化的)初始化另外一個(gè)結(jié)構(gòu)4) 結(jié)構(gòu)可以作為函數(shù)的返回值l 結(jié)構(gòu)指針作為參數(shù)的例子:/要求輸入名和姓,然后得到姓名中的字母總數(shù)#include #include struct namectchar fname20;char lname20;int letters;void getinfo (stru

20、ct namect *);void makeinfo(struct namect *);void showinfo(const struct namect *);int main(void)struct namect person;getinfo(&person);/傳遞的是結(jié)構(gòu)的地址makeinfo(&person);showinfo(&person);return 0;void getinfo (struct namect *pst)printf(Please enter your first name.n);gets(pst-fname);/實(shí)際操作的還是那一個(gè)結(jié)構(gòu)printf(Plea

21、se enter your last name.n);gets (pst - lname);void makeinfo (struct namect *pst)pst-letters = strlen(pst - fname) +strlen(pst - lname);void showinfo (const struct namect *pst)printf(%s %s,your name contains %d letters.n,pst-fname, pst-lname, pst-letters);l 結(jié)構(gòu)作為參數(shù)的例子:/要求輸入名和姓,然后得到姓名中的字母總數(shù)#include #in

22、clude struct namectchar fname20;char lname20;int letters;struct namect getinfo (void);/函數(shù)返回類型為structstruct namect makeinfo(struct namect);void showinfo(struct namect);int main(void)struct namect person;person = getinfo();person = makeinfo(person);/傳遞的參數(shù)為結(jié)構(gòu)showinfo(person);return 0;struct namect geti

23、nfo (void)struct namect temp;/創(chuàng)建一個(gè)新的結(jié)構(gòu)printf(Please enter your first name.n);gets(temp.fname);printf(Please enter your last name.n);gets (temp. lname);return temp;struct namect makeinfo (struct namect info)/創(chuàng)建一個(gè)新的結(jié)構(gòu)info.letters = strlen(info. fname) +strlen(info.lname);return info;void showinfo (str

24、uct namect info)/創(chuàng)建一個(gè)新的結(jié)構(gòu)printf(%s %s,your name contains %d letters.n,info.fname,info.lname, info.letters);14.7.5 結(jié)構(gòu),還是指向結(jié)構(gòu)的指針1) 為提高效率,使用結(jié)構(gòu)指針作為函數(shù)參數(shù),當(dāng)要保護(hù)數(shù)據(jù)、防止意外改變數(shù)據(jù)時(shí)對(duì)指針使用const限定詞2) 處理小型結(jié)構(gòu)時(shí)常用傳遞結(jié)構(gòu)值的方法;14.8 把結(jié)構(gòu)內(nèi)容保存到文件中14.9 結(jié)構(gòu):下一步是什么14.10 聯(lián)合介紹l 定義:一個(gè)能在同一個(gè)存儲(chǔ)空間里(但不同時(shí))存儲(chǔ)不同類型的數(shù)據(jù)類型。l 聯(lián)合的定義:聯(lián)合模板、聯(lián)合變量、聯(lián)合標(biāo)記Union

25、 hold int digit; double bigfl; char letter;union hold fit;/其中hold為聯(lián)合標(biāo)記,fit為聯(lián)合變量,方括弧為聯(lián)合模板;l 聯(lián)合的初始化:1) 初始化為同樣的另外一個(gè)聯(lián)合2) 初始化聯(lián)合的第1個(gè)元素3) 指定初始化項(xiàng)目14.11 枚舉類型l 定義:枚舉是一種代表整數(shù)常量的符號(hào)名稱;注:enum常量是int類型的,因此在使用int類型的任何地方都可以使用它。枚舉類型的目的是提高程序的可讀性。l 默認(rèn)情況下,枚舉列表中的常量被指定為整數(shù)值0、1、2等等。l 可以指定常量具有的值。例如:enum levels low = 100,medium

26、 = 500,high = 2000;l 如果只對(duì)某一個(gè)常量賦值,而沒(méi)有對(duì)后面的常量賦值,那么這些后面的常量會(huì)被賦予后續(xù)的值。例如:enum feline cat,lynx =10,puma,tiger; 則對(duì)應(yīng)值的一次為 0,10,11,12。14.12 typedef簡(jiǎn)介l 定義:typedef工具是一種高級(jí)數(shù)據(jù)特性,能為某一類型創(chuàng)建自己定義的名字。l Typrdef與#define的區(qū)別:1) typedef給出的符號(hào)名稱僅限于對(duì)類型,而不是對(duì)值;2) typedef的解釋由編譯器,而不是預(yù)處理器執(zhí)行3) typedef比#define更靈活l 使用方法:typedef unsigned

27、 char BYTE;隨后就可以用BYTE來(lái)定義變量了。即 typedef b A其中b為類型,A為字符名稱l 用typedef來(lái)命名一個(gè)結(jié)構(gòu)類型時(shí),可以省去結(jié)構(gòu)的標(biāo)記。注意:typedef并不是創(chuàng)建新的類型,只是創(chuàng)建了便于使用的標(biāo)簽。14.13 奇特的聲明C語(yǔ)言中,當(dāng)進(jìn)行一個(gè)聲明時(shí),可以添加修飾符來(lái)修飾名稱或標(biāo)示符。一共包含3個(gè)修飾符:*、()、l 這3個(gè)修飾符的使用規(guī)則:1) 優(yōu)先級(jí):()、優(yōu)先級(jí)一樣,高于*2) ()、順序從左向右組合14.14 函數(shù)和指針l 指向函數(shù)的指針:保存著指向函數(shù)代碼起始處的地址l 聲明一個(gè)函數(shù)指針時(shí),必須聲明它指向的函數(shù)類型(包括函數(shù)返回類型、函數(shù)的參量類型)

28、。viod (*pf)(char *)/pf是一個(gè)指向函數(shù)的指針,(*pf)為一個(gè)函數(shù),(char*)為該函數(shù)的參量列表,void作為其返回類型。l 函數(shù)名可以用來(lái)表示函數(shù)的地址。第16章 C預(yù)處理器和C庫(kù)C預(yù)處理器:因?yàn)樵诰幾g程序之前,先由預(yù)處理器檢查程序16.1 翻譯程序的第一步1) 首先將源代碼中出現(xiàn)的字符映射到源字符集;2) 第二,將兩個(gè)物理行轉(zhuǎn)換成一個(gè)邏輯行;3) 其次,編譯器將文本劃分成預(yù)處理的語(yǔ)言符號(hào)序列、空白字符及注釋序列。16.2 明顯常量:#define每個(gè)#define行由3部分組成:#define PX printf(“x is %d.n”,x); 第1部分 第2部分

29、第3部分第1部分:#define本身第2部分:縮略語(yǔ),稱為宏第3部分:類對(duì)象宏(主體)l 宏展開(kāi):預(yù)處理器在程序中發(fā)現(xiàn)了宏的實(shí)例后,總會(huì)用實(shí)體代替該宏,從宏變成最終的替換文本的過(guò)程稱為宏展開(kāi);l 預(yù)處理器不進(jìn)行計(jì)算,只是按照指令進(jìn)行文字替換操作。但是在雙引號(hào)中的宏卻不會(huì)進(jìn)行替換,例#define TWO 2#define OW “ABC”P(pán)rintf(“TWO:OW”); 則打印的結(jié)果是TWO:OW16.2.1 語(yǔ)言符號(hào)16.2.2 重定義常量假設(shè)將LIMIT定義為20,后來(lái)在該文件中又把LIMIT定義為25,這個(gè)過(guò)程被稱為重定義常量。16.3 在#define中使用參數(shù)l 類函數(shù)宏:通過(guò)使用

30、參數(shù),可以創(chuàng)建外形和作用都與函數(shù)相似的類函數(shù)宏。l 注意事項(xiàng):1) 使用足夠多的圓括號(hào)來(lái)保證以正確的順序進(jìn)行運(yùn)算和結(jié)合;2) 在宏中不要使用減量和加量運(yùn)算16.3.1 利用宏參數(shù)創(chuàng)建字符串:#運(yùn)算符l 字符串化:#符號(hào)可將語(yǔ)言符號(hào)轉(zhuǎn)換為字符串。假如x為一個(gè)宏參量,則#x可以把參數(shù)名轉(zhuǎn)化為相應(yīng)的字符串。16.3.2 #運(yùn)算符l #運(yùn)算符:將兩個(gè)語(yǔ)言符號(hào)組成單個(gè)語(yǔ)言符號(hào)16.4 宏,還是函數(shù)l 宏與函數(shù)間的選擇實(shí)際上是時(shí)間與空間的權(quán)衡。1) 宏產(chǎn)生內(nèi)聯(lián)代碼,也就是說(shuō)在程序中產(chǎn)生語(yǔ)句。如果使用20次宏,則會(huì)把20行代碼插入語(yǔ)句中。占用的空間更大。2) 函數(shù)的調(diào)用涉及控制權(quán)的轉(zhuǎn)移,花費(fèi)的時(shí)間更長(zhǎng)。l

31、使用宏注意事項(xiàng):1) 宏的名字中不能有空格2) 用圓括號(hào)括住每個(gè)參數(shù),并括主宏的整體定義3) 用大寫(xiě)字母表示宏函數(shù)名4) 使用宏代替函數(shù)來(lái)加快速度時(shí),應(yīng)先確定宏是否會(huì)引起重大差異。16.5 文件包含:#includel 預(yù)處理器發(fā)現(xiàn)#include指令后,就會(huì)尋找后跟的文件名并把這個(gè)文件的內(nèi)容包含到當(dāng)前文件中。1) #include 文件名放在尖括號(hào)中,告訴預(yù)處理器在標(biāo)準(zhǔn)系統(tǒng)目錄文件中尋找文件2) #include”names_st.h” 文件名放在雙引號(hào)中,告訴預(yù)處理器在當(dāng)前目錄中尋找文件。16.5.1 頭文件:一個(gè)實(shí)例1. 頭文件:#define SLEN 32struct names_s

32、tchar firstSLEN;char lastSLEN;typedef struct names_st names;/typedef定義void get_names(names *);/函數(shù)參數(shù)為指向結(jié)構(gòu)的指針void show_names(const names *);2. names_st.c#include#includenames_st.hvoid get_names(names *pn)int i;printf(Please enter your first name:);fgets(pn-first,SLEN,stdin);/用fgets函數(shù)是避免目標(biāo)數(shù)組溢出/*i=0;whi

33、le(pn-firsti != n & pn - firsti != 0)i+;if(pn - firsti = n)pn - firsti = 0;/輸入的字符串中有換行符n(ASII碼值為0x0a)時(shí),用空字符0(ASII碼值為0x00)代替elsewhile(getchar()!= n)continue;/*如果不加入這段程序,則姓的字符個(gè)數(shù)不到32時(shí),會(huì)把換行符當(dāng)成一個(gè)字符,輸出時(shí)便會(huì)換行。當(dāng)姓超過(guò)32字符時(shí),取前31個(gè)字符printf(Please enter your last name:);fgets(pn - last,SLEN,stdin);i=0;while(pn - la

34、sti != n & pn - lasti !=0)i+;if(pn - lasti = n)pn - lasti = 0;elsewhile(getchar()!= n)continue;void show_names(const names *pn)printf(%s %s ,pn - first,pn - last);3. useheader.c/主程序#include#includenames_st.hint main(void)names candidate;get_names(&candidate);printf(Lets welcome );show_names(&candida

35、te);printf(to this program!n);return 0;16.5.2 使用頭文件l 頭文件內(nèi)容的最常見(jiàn)的形式包括:1) 明顯常量2) 宏函數(shù)3) 函數(shù)聲明4) 結(jié)構(gòu)板定義5) 類型定義6) 可以用頭文件來(lái)聲明多個(gè)文件共享的外部變量7) 使用具有文件作用域、內(nèi)部鏈接和const限定詞的變量或數(shù)組。16.6 其他命令有時(shí)需要不同的工作環(huán)境準(zhǔn)備不同的C程序。預(yù)處理器提供一些指令來(lái)幫助程序員編寫(xiě)這樣的代碼:改變一些#define宏的值后,這些代碼就可以從一個(gè)系統(tǒng)移植到別的系統(tǒng)??煞譃樗拇箢悾?undef、條件編譯、#line和#error、#progma16.6.1 #undef

36、指令l 取消前面的#define定義l 如果想使用一個(gè)特定的名字,但又不確定前面是否已經(jīng)使用了該名字,為安全起見(jiàn),就可以取消該名字的定義。16.6.2 已定義:C預(yù)處理器的觀點(diǎn)l 已定義:如果C預(yù)處理器遇到一個(gè)標(biāo)示符,要么是已定義,要么是未定義。其中已定義是指C預(yù)處理定義的,如果標(biāo)示符不是一個(gè)宏,則預(yù)處理器把標(biāo)示符 當(dāng)做未定義。l 已定義宏:分為類對(duì)象宏(包括空宏)、類函數(shù)宏。l #define宏的作用域:從文件的定義點(diǎn)開(kāi)始,直到用#undef取消宏為止,或直到文件尾為止。16.6.3 條件編譯l 條件編譯指令可以告訴編譯器:根據(jù)編譯時(shí)的條件,接受或忽略信息(代碼)塊。包括#ifdef、#el

37、se、#endif或#ifndef 或#if、#elif1) #ifdef、#else、#endif#ifdef #else格式非常類似于C中的if else。主要差異為預(yù)處理器不能識(shí)別代碼塊的花括號(hào),所以需要#endif來(lái)結(jié)束指令塊。2) #ifndef #endif指令 #ifndef用來(lái)定義此前未定義的常量。 #ifndef #endif指令通常用于防止多次包含同一文件。3) #if #elif指令 #if后跟常量整數(shù)表達(dá)式(更像if),在該表達(dá)式中可以使用C的關(guān)系運(yùn)算符合邏輯運(yùn)算符。 #ifdef 與#if的關(guān)系#ifdef VAX #if defined(VAX) 其中defined是預(yù)處理器運(yùn)算符。如果defined的參數(shù)已用#define定義過(guò),則defined返回1,否則返回016.6.4 預(yù)定義

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論