王 宣
1)C 語言。在1972 年開發Unix 操作系統時,丹尼斯里奇和肯湯姆遜設計了C 語言。C 語言不完全是里奇突發奇想而來,他是在湯姆遜發明的b 語言的基礎上進行設計。把C 語言作為程序員的編程工具是它設計的初衷,因此它的主要目標是成為一種有用的語言。作為面向過程抽象化的通用編程語言,C 語言在底層開發中得到了廣泛的應用。C 語言可以進行簡單地編譯和處理低級內存,是一種高效的編程語言,它只產生少量的機器語言,可以在沒有任何運行環境支持的情況下運行。
2)指針。C 語言中最重要的概念之一就是指針。它用于存儲變量的地址,地址在scanf()函數中作為參數。一般來說,如果主函數不使用返回值,則必須對其進行尋址以修改主函數中的值。
3)函數。函數是執行特定任務的獨立程序代碼單元。函數的結構和用法已經被C 語言的語法規則定義了。函數在C 語言中的細節略有不同。某些函數執行操作,如printf()的作用是將數據打印在屏幕上顯示出來,而一些函數則查找直接程序以供使用,如strlen(),向程序返回指定字符串的長度。
從根本上看,指針是一個值為內存地址的變量,正如char 類型變量的值是字符,int 類型變量的值是整數,指針變量的值是地址。
與指針相關的運算符:
&,當&后面跟一個變量名時,&給出的是變量的地址。示例:變量ph 的地址由&ph 表示。
*,當*后跟指針名稱或地址時,*給出的是指針儲存的地址上的值。示例:
ptr=&ph;//把ph 的地址儲存在ptr
val=*ptr;//將ptr 指向的值(ph 的值)賦值給val
這兩條語句等價于將ph 的值賦給val,即val=ph。
函數的參數有多種數據類型,不僅可以是字符型數據,還可以是指針型數據。指針型數據的作用是將一個變量的地址從一個函數傳遞給另一個函數。實參與形參之間的數據傳遞在C 語言中是單向的“值傳遞”。
例:

interchange()使用的變量并不是main()中的變量。因此交換a 和b 的值,對x 和y 的值沒有影響。如果使用return 語句,可以將被調函數的值返回到主函數,但是只能返回一個值,故現在必須使用指針來返回兩個值。
例:

該程序輸出為:
originally x=5 and y=10.
now x=10 and y=5.
interchange(&x,&y)該函數傳遞的不是x和y 的值,而是他們的地址。
viod interchange(int *a,int*b)是函數的聲明。
接下來在函數體中聲明了一個交換值時必須的臨時變量,int temp;
temp=*a;把x 的值賦值給temp,a 儲存的是x 的地址,則*a 表示的是a 儲存的地址對應的值,即x 的值。
把y 的值賦給x,*a=*b;這條語句相當于x=y。
*b=temp;把temp 的值賦給y。
函數可以返回整型數據、字符型數據,同時還可以返回指針型數據。指針函數返回的就是指針型數據。它的一般定義如下:
類型名 *函數名(函數參數表列);
其中,后綴運算符括號“()”表示這是一個函數,其前綴運算符星號“*”表示此函數為指針型函數,其函數值為指針,即它帶回來的值的類型為指針,當調用這個函數后,將得到一個“指向返回值為…的指針(地址),“類型名”表示函數返回的指針指向的類型”。
例:將字符串s1 與s2 拼接

char *str(char *p1,char *p2);為定義一個函數,其返回值為char 類型的指針。
該函數的功能是將字符串s1 與字符串s2 拼接起來。
while(*p1)
p1++;
當s1 有字符時*p1 非零,循環不斷進行,使指針p1 向后移動。當指針移動到s1 結束時,*p 為零,循環停止。
接著執行while(*p2)

當*p2 非零時,將*p2 賦值給*p1,同時,指針p1,p2 一起向后移動,如此循環,直到*p2 為0(指針p2 處于s2 結尾處),停止循環,實現s1 與s2 的拼接。
return temp;將s1 與s2 拼接好的字符串的地址返回。
程序編譯后,每個函數都有執行第一條指令的地址即首地址,稱為函數指針。函數指針即指向函數的指針變量,要間接調用函數可以使用指針變量來實現。
int (*pf)(int,int);
通過將pf 與括號中的“*”強制組合組合在一起,表示定義的pf 是一個指針,然后與下面的“()”再次組合,表示的是該指針指向一個函數,括號里表示為int 類型的參數,最后與前面的int 組合,此處int 表示該函數的返回值。因此,pf 是指向函數的指針,該函數的返回值為int。函數指針與返回指針的函數的含義大不相同。函數指針本身是一個指向函數的指針。指針函數本身是一個返回值為指針的函數。
例:


float (*p)(float x,float y);定 義 了 一個指向函數的指針變量。首先c=(*p)(a,b);語句:因為指針p 儲存的是max 函數的首地址,(*p)(a,b)就相當于max(a,b),函數返回較大值。其次c=(*p)(a,b);語句:因為指針p 儲存的是min函數的首地址,(*p)(a,b)也就相當于min(a,b),函數返回較小值。