王 宣
1)C 語(yǔ)言。在1972 年開(kāi)發(fā)Unix 操作系統(tǒng)時(shí),丹尼斯里奇和肯湯姆遜設(shè)計(jì)了C 語(yǔ)言。C 語(yǔ)言不完全是里奇突發(fā)奇想而來(lái),他是在湯姆遜發(fā)明的b 語(yǔ)言的基礎(chǔ)上進(jìn)行設(shè)計(jì)。把C 語(yǔ)言作為程序員的編程工具是它設(shè)計(jì)的初衷,因此它的主要目標(biāo)是成為一種有用的語(yǔ)言。作為面向過(guò)程抽象化的通用編程語(yǔ)言,C 語(yǔ)言在底層開(kāi)發(fā)中得到了廣泛的應(yīng)用。C 語(yǔ)言可以進(jìn)行簡(jiǎn)單地編譯和處理低級(jí)內(nèi)存,是一種高效的編程語(yǔ)言,它只產(chǎn)生少量的機(jī)器語(yǔ)言,可以在沒(méi)有任何運(yùn)行環(huán)境支持的情況下運(yùn)行。
2)指針。C 語(yǔ)言中最重要的概念之一就是指針。它用于存儲(chǔ)變量的地址,地址在scanf()函數(shù)中作為參數(shù)。一般來(lái)說(shuō),如果主函數(shù)不使用返回值,則必須對(duì)其進(jìn)行尋址以修改主函數(shù)中的值。
3)函數(shù)。函數(shù)是執(zhí)行特定任務(wù)的獨(dú)立程序代碼單元。函數(shù)的結(jié)構(gòu)和用法已經(jīng)被C 語(yǔ)言的語(yǔ)法規(guī)則定義了。函數(shù)在C 語(yǔ)言中的細(xì)節(jié)略有不同。某些函數(shù)執(zhí)行操作,如printf()的作用是將數(shù)據(jù)打印在屏幕上顯示出來(lái),而一些函數(shù)則查找直接程序以供使用,如strlen(),向程序返回指定字符串的長(zhǎng)度。
從根本上看,指針是一個(gè)值為內(nèi)存地址的變量,正如char 類型變量的值是字符,int 類型變量的值是整數(shù),指針變量的值是地址。
與指針相關(guān)的運(yùn)算符:
&,當(dāng)&后面跟一個(gè)變量名時(shí),&給出的是變量的地址。示例:變量ph 的地址由&ph 表示。
*,當(dāng)*后跟指針名稱或地址時(shí),*給出的是指針儲(chǔ)存的地址上的值。示例:
ptr=&ph;//把ph 的地址儲(chǔ)存在ptr
val=*ptr;//將ptr 指向的值(ph 的值)賦值給val
這兩條語(yǔ)句等價(jià)于將ph 的值賦給val,即val=ph。
函數(shù)的參數(shù)有多種數(shù)據(jù)類型,不僅可以是字符型數(shù)據(jù),還可以是指針型數(shù)據(jù)。指針型數(shù)據(jù)的作用是將一個(gè)變量的地址從一個(gè)函數(shù)傳遞給另一個(gè)函數(shù)。實(shí)參與形參之間的數(shù)據(jù)傳遞在C 語(yǔ)言中是單向的“值傳遞”。
例:
interchange()使用的變量并不是main()中的變量。因此交換a 和b 的值,對(duì)x 和y 的值沒(méi)有影響。如果使用return 語(yǔ)句,可以將被調(diào)函數(shù)的值返回到主函數(shù),但是只能返回一個(gè)值,故現(xiàn)在必須使用指針來(lái)返回兩個(gè)值。
例:
該程序輸出為:
originally x=5 and y=10.
now x=10 and y=5.
interchange(&x,&y)該函數(shù)傳遞的不是x和y 的值,而是他們的地址。
viod interchange(int *a,int*b)是函數(shù)的聲明。
接下來(lái)在函數(shù)體中聲明了一個(gè)交換值時(shí)必須的臨時(shí)變量,int temp;
temp=*a;把x 的值賦值給temp,a 儲(chǔ)存的是x 的地址,則*a 表示的是a 儲(chǔ)存的地址對(duì)應(yīng)的值,即x 的值。
把y 的值賦給x,*a=*b;這條語(yǔ)句相當(dāng)于x=y。
*b=temp;把temp 的值賦給y。
函數(shù)可以返回整型數(shù)據(jù)、字符型數(shù)據(jù),同時(shí)還可以返回指針型數(shù)據(jù)。指針函數(shù)返回的就是指針型數(shù)據(jù)。它的一般定義如下:
類型名 *函數(shù)名(函數(shù)參數(shù)表列);
其中,后綴運(yùn)算符括號(hào)“()”表示這是一個(gè)函數(shù),其前綴運(yùn)算符星號(hào)“*”表示此函數(shù)為指針型函數(shù),其函數(shù)值為指針,即它帶回來(lái)的值的類型為指針,當(dāng)調(diào)用這個(gè)函數(shù)后,將得到一個(gè)“指向返回值為…的指針(地址),“類型名”表示函數(shù)返回的指針指向的類型”。
例:將字符串s1 與s2 拼接
char *str(char *p1,char *p2);為定義一個(gè)函數(shù),其返回值為char 類型的指針。
該函數(shù)的功能是將字符串s1 與字符串s2 拼接起來(lái)。
while(*p1)
p1++;
當(dāng)s1 有字符時(shí)*p1 非零,循環(huán)不斷進(jìn)行,使指針p1 向后移動(dòng)。當(dāng)指針移動(dòng)到s1 結(jié)束時(shí),*p 為零,循環(huán)停止。
接著執(zhí)行while(*p2)
當(dāng)*p2 非零時(shí),將*p2 賦值給*p1,同時(shí),指針p1,p2 一起向后移動(dòng),如此循環(huán),直到*p2 為0(指針p2 處于s2 結(jié)尾處),停止循環(huán),實(shí)現(xiàn)s1 與s2 的拼接。
return temp;將s1 與s2 拼接好的字符串的地址返回。
程序編譯后,每個(gè)函數(shù)都有執(zhí)行第一條指令的地址即首地址,稱為函數(shù)指針。函數(shù)指針即指向函數(shù)的指針變量,要間接調(diào)用函數(shù)可以使用指針變量來(lái)實(shí)現(xiàn)。
int (*pf)(int,int);
通過(guò)將pf 與括號(hào)中的“*”強(qiáng)制組合組合在一起,表示定義的pf 是一個(gè)指針,然后與下面的“()”再次組合,表示的是該指針指向一個(gè)函數(shù),括號(hào)里表示為int 類型的參數(shù),最后與前面的int 組合,此處int 表示該函數(shù)的返回值。因此,pf 是指向函數(shù)的指針,該函數(shù)的返回值為int。函數(shù)指針與返回指針的函數(shù)的含義大不相同。函數(shù)指針本身是一個(gè)指向函數(shù)的指針。指針函數(shù)本身是一個(gè)返回值為指針的函數(shù)。
例:
float (*p)(float x,float y);定 義 了 一個(gè)指向函數(shù)的指針變量。首先c=(*p)(a,b);語(yǔ)句:因?yàn)橹羔榩 儲(chǔ)存的是max 函數(shù)的首地址,(*p)(a,b)就相當(dāng)于max(a,b),函數(shù)返回較大值。其次c=(*p)(a,b);語(yǔ)句:因?yàn)橹羔榩 儲(chǔ)存的是min函數(shù)的首地址,(*p)(a,b)也就相當(dāng)于min(a,b),函數(shù)返回較小值。