




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、13.1 對(duì)函數(shù)的深入談?wù)?一. main函數(shù)的參數(shù) main函數(shù)是C語(yǔ)言的主函數(shù),是整個(gè)程序的入口,每 個(gè)C程序有且只有一個(gè)main函數(shù)。在此之前我們學(xué)過(guò)C程 序中,main函數(shù)括號(hào)里是空的,沒有任何參數(shù)。在本節(jié)中, 我們學(xué)習(xí)帶參數(shù)的main函數(shù)。main函數(shù)通常由兩個(gè)參數(shù), 其定義形式如下: main(int argc, char *argv) argc和argv是main函數(shù)的兩個(gè)參數(shù),其名 稱可以編程人員自行確定,但是每個(gè)參數(shù) 的類型是C語(yǔ)言規(guī)定好了的。第一個(gè)參數(shù)必 須是整型;第二個(gè)參數(shù)必須是字符串的指 針,也就是char類型的二維指針。第二個(gè)參 數(shù)也可以定義為char *agrv。
2、在C語(yǔ)言中,main函數(shù)是程序的入口,在一 般情況下,沒有其它的函數(shù)來(lái)調(diào)用main函 數(shù),那么main函數(shù)的參數(shù)有什么中用呢? 我們對(duì)包含以上主函數(shù)的、名為myc的文件進(jìn)行 編譯連接,生成名為myc.exe的可執(zhí)行文件后, 即可在dos下輸入命令執(zhí)行該程序: myc 這就是命令行,myc即為執(zhí)行程序的命令。這時(shí) argc中的值為1,argv0中將存放字符串“myc” 的首地址,即指向字符串“myc”。如輸入: myc OK! GOOD 在此命令行中OK!和GOOD稱為命令行參數(shù)。這 時(shí)argc的值為3,也就是argc里存放的是字符串的 個(gè)數(shù),argv里存放的如下圖所示。 argvargv0 a
3、rgv1 argv2 0 myc OK! GOOD argv0、argv1、argv2分別指向字符 串”myc”、”O(jiān)K!”、“GOOD”。其中,為 了執(zhí)行程序,字符串a(chǎn)rgv0必不可少, argc值為3。從argv1開始都是可選的命令 參數(shù)。另外,按標(biāo)準(zhǔn)規(guī)定,argvargc由系 統(tǒng)置0。 命令行中,各參數(shù)之間用空格符或TAB符隔 開,空格不作為參數(shù)的內(nèi)容。若要把空格 也作為參數(shù)的內(nèi)容,應(yīng)該把字符串放在一 對(duì)雙引號(hào)內(nèi)。 例13.1 若以下程序放在myc.c文件中,在編譯連接后,生成一個(gè) myc.exe文件 ,輸入argc和argv中的數(shù)據(jù)。 #include”stdio.h” main(in
4、t argc, char *argv) int i; printf(“argc=%dn”,argc); for(i=1;iargc;i+) printf(“%s”,argvi); printf(“n”); 若在命令中輸入: myc A COMMAND LINE 程序?qū)⑤敵觯?argc=4 A COMMAND LINE 在C語(yǔ)言中,函數(shù)名代表的是一個(gè)函數(shù)的入 口地址,因此可以定義一個(gè)指針指向該入 口地址,即指向函數(shù)的指針。 指向函數(shù)的指針變量定義格式如下: 函數(shù)返回值類型(*指針名)(函數(shù)參數(shù)列 表); 例13.2 以下程序使用函數(shù)指針調(diào)用函數(shù) int fun(int a, int *b) ma
5、in() int (*pfun)(int, int*), a, b, s; /*此處定義了pfun這個(gè)函數(shù)指 針*/ pfun=fun; /*將函數(shù)名fun賦給指針pfun,即讓pfun指向 fun*/ s=(*pfun)(a, /*此處通過(guò)pfun指針來(lái)調(diào)用fun函數(shù),相當(dāng)于調(diào)用 s=fun(a, main() fun(6); 答案:136 一. 宏 1. 不帶參數(shù)的宏 定義形式如下: #define 宏名 替換文本 或 #define 宏名 例13.4 #define PI 3.1415926 (1)宏名一般習(xí)慣用大寫字母表示,以便與變量名 相區(qū)別。這只是建議,宏名也可以使用小寫字母。 (
6、2)宏定義行的替換文本中還可以包含已經(jīng)定義過(guò) 的宏名。 如:例13.5 #define PI 3.1415926 #define ADDPI (PI+1) #define TWO_ADDPI (2*ADDPI) (3)在宏展開時(shí),C語(yǔ)言僅僅使用替換文本替換宏 名,而不是使用計(jì)算的結(jié)果進(jìn)行替換。 (4)宏定義時(shí),如一行寫不下,可以在行末尾加反 斜線“”,然后在第二行接著再寫。 (5)同一宏名不能重復(fù)定義,除非兩個(gè)宏定 義命令行完全一致。 (6)宏展開時(shí),不能替換雙引號(hào)中與宏名相 同的字符串。 (7)宏定義的有效范圍為定義點(diǎn)到文件結(jié)束, 還可以用#undef提前終止已經(jīng)定義的宏。 帶參數(shù)的宏,即宏
7、名后帶有參數(shù)列表的宏 定義為一個(gè)帶參數(shù)的宏。在進(jìn)行宏展開時(shí), 用表達(dá)式替換該宏名,同時(shí)用實(shí)參代替宏 名后的形參。 例13.6 #define MAX(x,y) (xy ? x:y) max=MAX(10,5); 宏展開后,賦值語(yǔ)句為:max=(105 ? 10:5); (1)在替換帶參數(shù)的宏名時(shí),一對(duì)圓括號(hào)不 能少,圓括號(hào)中實(shí)參的個(gè)數(shù)應(yīng)該與形參的 個(gè)數(shù)相同,如有多個(gè)參數(shù),各參數(shù)用逗號(hào) 隔開。 (2)與不帶參數(shù)的宏相同,同一個(gè)宏名不能 重復(fù)定義,除非兩個(gè)宏定義命令行完全一 致。 (3)在宏替換行的表達(dá)式中的形參和整個(gè)表 達(dá)式應(yīng)該用括號(hào)括起來(lái)。 例13.7 #define MUL(a,b) (a)
8、*(b) m=MUL(10-5, 5+1)/2; 結(jié)果輸出m=_。 答案:15 (4)帶參數(shù)的宏與函數(shù)的異同:定義時(shí)都有形參, 不過(guò)宏定義時(shí)形參不能指定類型。在調(diào)用時(shí)都需 要傳遞實(shí)參,不同的是宏替換時(shí)對(duì)參數(shù)沒有類型 要求。另外,宏替換是在編譯時(shí)由預(yù)處理程序完 成的,因此宏替換不占運(yùn)行時(shí)間;二函數(shù)的調(diào)用 是在程序運(yùn)行中處理的,臨時(shí)給分配存儲(chǔ)單元, 在函數(shù)調(diào)用過(guò)程中還需要占用一系列的處理時(shí)間。 “文件包含”處理,指的是一個(gè)源文件可以將另外 一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái),也就是將其他 源文件包含到本文件中來(lái)。這樣做的好處是,我 們可以把程序中不同功能的模塊分別放到不同的 文件中,這樣,如果需要那部分
9、功能,就把定義 該功能模塊的文件包含到本文件中。C語(yǔ)言用 #include命令等來(lái)實(shí)現(xiàn)文件的包含功能。#include 命令行的形式如下: #include “文件名” 或 #include (1)#include命令行通常書寫在文件的開頭,故有 時(shí)也把包含文件稱作“頭文件”。 (2)包含文件中,一般包含一些公用的#define命 令行、外部說(shuō)明或函數(shù)的原型說(shuō)明。 (3)當(dāng)包含文件修改后,對(duì)包含該文件的源程序必 須重新進(jìn)行編譯連接。 (4)在一個(gè)程序中,允許有任意多個(gè)#include命令 行。 ()在包含文件中還可以包含其他文件。 例13.8 下面程序由兩個(gè)源程序文件14.h和14.c組成,程
10、序編譯運(yùn)行的 結(jié)果是_。 14.h 的源程序?yàn)椋?#define N 10 #define f2(x) (x*N) 14.c的源程序?yàn)椋?#include #define M 8 #define f(x) (x)*M) #include “14.h” main() int i, j; i=f(1+1); j=f2(1+1); printf(“%d %dn”,i, j); 答案:16 11 一. 存儲(chǔ)分類 根據(jù)變量在內(nèi)存的不同位置,可以將變 量分為兩類:自動(dòng)類和靜態(tài)類。 根據(jù)程序中變量定義的位置不同,又可 以將變量分為局部變量和全局變量。在函 數(shù)外部定義的變量是全局變量。局部變量 是內(nèi)部變量,全
11、局變量也稱為外部變量。 局部變量可以是自動(dòng)類變量,也可以是 靜態(tài)類變量。全局變量只能是靜態(tài)類變量。 C語(yǔ)言提供了與此相關(guān)的4個(gè)關(guān)鍵字:auto (自動(dòng))、register(寄存器)、static(靜 態(tài))、extern(外部)。它們可以放在類型 名的左邊,也可以放在類型名的右邊。例 如: auto int a; 或 int auto a; 局部變量有3種類型:auto、register和 static。 1. auto變量 在定義變量時(shí),如果沒有指定相應(yīng)的存 儲(chǔ)類型,則系統(tǒng)默認(rèn)該存儲(chǔ)類型為auto類型。 當(dāng)程序進(jìn)入定義該變量的函數(shù)或復(fù)合語(yǔ)句 時(shí),系統(tǒng)為這些變量臨時(shí)分配內(nèi)存單元。 當(dāng)程序離開這個(gè)
12、函數(shù)或復(fù)合語(yǔ)句時(shí),系統(tǒng) 將銷毀這些內(nèi)存單元,使其數(shù)據(jù)不再有效。 例13.9 以下程序的輸出結(jié)果是_。 main() int i=1, i_sum; float f, f_sum; int i; i=10; printf(“(1)i=%dn”,i); printf(“(2)i=%dn”,i); 答案(1)i=10 (2)i=1 register變量(寄存器變量)與auto變量一樣, 是自動(dòng)類變量,其作用域和生存期與auto變 量完全一樣。register變量與auto變量唯一 的區(qū)別是auto變量在內(nèi)存中分配存儲(chǔ)空間, 而register變量在CPU的寄存器中分配。 寄存器運(yùn)算速度非常的快,但寄
13、存器數(shù)量 有限,一般情況下,不建議編程人員使用 寄存器變量。 在函數(shù)內(nèi)部或復(fù)合函數(shù)語(yǔ)句中定義變量時(shí),如果 使用static來(lái)說(shuō)明,就構(gòu)成了靜態(tài)局部變量。靜態(tài) 局部變量的作用域與auto和register類型變量一樣, 但其生存期卻完全不一樣。 靜態(tài)局部變量在內(nèi)存的靜態(tài)存儲(chǔ)區(qū)占據(jù)著永久性 的存儲(chǔ)單元,即使離開定義該變量的函數(shù)(或復(fù) 合語(yǔ)句),該存儲(chǔ)單元也不會(huì)被銷毀。當(dāng)下次再 進(jìn)行定義該變量的函數(shù)(或復(fù)合語(yǔ)句)時(shí),存儲(chǔ) 單元仍然保存著原來(lái)的值。 例13.10 以下程序運(yùn)行后的輸出結(jié)果是_。 fun(int a) int b=0; static int c=3; b+; c+; return (a+
14、b+c); main() int i, a=5; for(i=0;i3;i+) printf(“ %d %d ”,i, fun(a); printf(“n”); 答案:0 10 1 11 2 12 在外部任意位置定義的變量,稱為全局變量。全局變量都是靜態(tài)變量,其作用域從定 義的位置開始,到整個(gè)源文件結(jié)束為止。 例13.11 以下程序的運(yùn)行結(jié)果是_。 int sum; int fun1() sum+=20; int a; int fun2() a=20; sum+=a; main() sum=0; fun1(); a=8; fun2(); printf(“sum=%d a=%d”, sum, a
15、); 答案:sum=40 a=20 一. malloc函數(shù) malloc函數(shù)用于分配內(nèi)存空間。ANSI C標(biāo)準(zhǔn)規(guī)定 malloc函數(shù)返回值的類型為void*,該函數(shù)的調(diào)用形 式為: malloc(size) 其中參數(shù)size的類型為unsigned int,表示需要分配 的內(nèi)存的字節(jié)數(shù)。如果系統(tǒng)有足夠的內(nèi)存可供分配, 函數(shù)返回一個(gè)指向有size個(gè)字節(jié)的存儲(chǔ)區(qū)首地址, 該首地址的基類型為void類型;若沒有足夠的內(nèi)存 單元可供分配,函數(shù)返回空值(NULL)。 例13.12 malloc函數(shù)的應(yīng)用 int *p; float *q; p=(int*)malloc(4); q=(float*)mal
16、loc(4); if(p!=NULL) *p=6; If(q!=NULL) *q=3.8; 動(dòng)態(tài)分配存儲(chǔ)單元 p 6 q 3.8 動(dòng)態(tài)分配得到的內(nèi)存單元沒有名字,只能 通過(guò)指針變量來(lái)引用它。一旦指針變量的 值發(fā)生改變,原存儲(chǔ)單元及所存數(shù)據(jù)都將 無(wú)法再引用。通過(guò)調(diào)用malloc函數(shù)所分配的 動(dòng)態(tài)存儲(chǔ)單元中沒有確定的初值。 在調(diào)用malloc進(jìn)行存儲(chǔ)分配時(shí),如果不能確 定數(shù)據(jù)類型所占字節(jié)數(shù),可以調(diào)用sizeof運(yùn) 算符來(lái)求得。如上例可以改為: p=(int *)malloc(sizeof(int); q=(float *)malloc(sizeof(float); 這是一種常用的方式,它由系統(tǒng)來(lái)計(jì)
17、算數(shù) 據(jù)類型的字節(jié)數(shù)。 通過(guò)靜態(tài)存儲(chǔ)分配的變量和數(shù)組,在生存期后, 或者程序運(yùn)行結(jié)束后,所占用的存儲(chǔ)單元會(huì)由系 統(tǒng)自動(dòng)釋放。但是,動(dòng)態(tài)存儲(chǔ)分配的內(nèi)存單元, 必須由程序員手動(dòng)進(jìn)行釋放。如果沒有對(duì)其進(jìn)行 釋放,則內(nèi)存單元會(huì)一致被占用,從而無(wú)法被系 統(tǒng)重新分配。我們可以使用free函數(shù)釋放動(dòng)態(tài)分 配的內(nèi)存單元。free函數(shù)的調(diào)用形式如下: free(p); 這里指針p必須指向由動(dòng)態(tài)分配函數(shù)(如malloc) 分配的地址。free函數(shù)將指針p所指向的空間釋放, 使部分空間可以由系統(tǒng)重新支配。此函數(shù)沒有返 回值。 通常情況下,malloc函數(shù)用于分配單個(gè)數(shù)據(jù)類型 的存儲(chǔ)單元,但是有時(shí)候根據(jù)需求可能要分配
18、多 個(gè)同一類型的連續(xù)的存儲(chǔ)空間。ANSI C提供了 calloc用于此功能的實(shí)現(xiàn),calloc函數(shù)的返回值是 基類型為void的指針。calloc函數(shù)的調(diào)用形式: calloc(n,size); 其中參數(shù)n和size的類型都是unsigned int。calloc 函數(shù)用來(lái)給n個(gè)同一類型的數(shù)據(jù)項(xiàng)分配連續(xù)的存儲(chǔ) 空間,其中每個(gè)數(shù)據(jù)項(xiàng)的長(zhǎng)度為size個(gè)字節(jié)。若 分配成功,函數(shù)返回存儲(chǔ)空間的首地址;否則返 回空值。由calloc函數(shù)分配的存儲(chǔ)單元,系統(tǒng)自動(dòng) 置初值為0。 例13.13 int *pint; pint=(int *)calloc(10,sizeof(int); free(pint); 程序調(diào)用calloc函數(shù)在內(nèi)存中分配了10個(gè)連 續(xù)的int類型的存儲(chǔ)空間,由pint 指向存儲(chǔ)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 裕龍石化 協(xié)議書6篇
- 中藥品牌戰(zhàn)略規(guī)劃-全面剖析
- 農(nóng)村污水處理與土壤修復(fù)-全面剖析
- 糖果制造行業(yè)綠色轉(zhuǎn)型-全面剖析
- 供應(yīng)鏈金融風(fēng)險(xiǎn)防范體系-全面剖析
- 電影與文化多樣性傳播研究-全面剖析
- 智能化皮膚護(hù)理產(chǎn)品發(fā)展趨勢(shì)-全面剖析
- 游戲市場(chǎng)消費(fèi)者行為預(yù)測(cè)-全面剖析
- 氣候變化與地緣政治的相互作用-全面剖析
- 藝術(shù)批評(píng)方法的歷史演變-全面剖析
- 全國(guó)高考物理高考題說(shuō)題比賽一等獎(jiǎng)?wù)n件物理說(shuō)題李煥景
- 華為MA5800配置及調(diào)試手冊(cè)
- 巴金名著導(dǎo)讀《寒夜》
- 2024年建筑業(yè)10項(xiàng)新技術(shù)
- 《環(huán)境建設(shè)工程概算、預(yù)算編制辦法》
- 提升服務(wù)行業(yè)人員的職業(yè)道德和職業(yè)素養(yǎng)
- 按摩椅行業(yè)分析及市場(chǎng)前景展望報(bào)告
- 2024年上海外服招聘筆試參考題庫(kù)附帶答案詳解
- 改善患者就醫(yī)體驗(yàn)培訓(xùn)課件
- 養(yǎng)殖烏龜入門知識(shí)培訓(xùn)課件
- 關(guān)于設(shè)備性能評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論