1. 函數(shù)原型
1.1 函數(shù)原型是什么?
函數(shù)頭以;
結(jié)尾父泳,構(gòu)成函數(shù)原型般哼。
1.2 函數(shù)原型怎么用?
函數(shù)原型通常放在頭文件里面或者調(diào)用它的函數(shù)的前面尘吗。
1.3 函數(shù)原型有什么用逝她?
提前告訴編譯器使用的函數(shù)基本信息(名稱、參數(shù)個數(shù)類型睬捶、返回類型)黔宛。
1.4 函數(shù)前置聲明
- 試一試
#include <stdio.h>
void main(){
func();
}
void func(){
printf("Hello World\n");
}
通常把main()
放在代碼最前面便于閱讀,但是這樣會導(dǎo)致編譯時因為找不到main()
內(nèi)部調(diào)用函數(shù)而錯誤或警告擒贸。在main()
前加上函數(shù)原型可以解決這類問題臀晃,稱為函數(shù)前置聲明。
#include <stdio.h>
void func();// 函數(shù)前置聲明
void main(){
func();
}
void func(){
printf("Hello World\n");
}
2. 指針與函數(shù)
2.1 函數(shù)名
函數(shù)名與數(shù)組名一樣表示的是地址介劫,不同的是函數(shù)名是執(zhí)行函數(shù)代碼的起始位置徽惋,數(shù)組是數(shù)組第一個元素的地址。
#include <stdio.h>
void func(){
printf("Hello World\n");
}
void main(){
printf("func=%p\n",func);
printf("func=%p\n",&func);
}
直接使用函數(shù)名func
和取函數(shù)地址&func
獲取的值是相同的座韵。
2.2 函數(shù)指針
函數(shù)指針是指向函數(shù)的指針變量险绘,即本質(zhì)是一個指針變量踢京。
定義的方式如下:
類型說明符 (*函數(shù)名) (參數(shù))
其實這里不能稱為函數(shù)名,應(yīng)該叫做指針的變量名宦棺。這個特殊的指針指向一個返回整型值的函數(shù)瓣距。指針的聲明筆削和它指向函數(shù)的聲明保持一致。
指針名和指針運算符外面的括號改變了默認(rèn)的運算符優(yōu)先級代咸。如果沒有圓括號蹈丸,就變成了一個返回整型指針的函數(shù)的原型聲明。
數(shù)組名即數(shù)組的指針呐芥,函數(shù)名也是函數(shù)的指針逻杖。
例如:
void (*fptr)();
-
賦值
把函數(shù)的地址賦值給函數(shù)指針,可以采用下面兩種形式:fptr = func; fptr = &func;
函數(shù)名即函數(shù)地址思瘟。這兩種賦值方式完全一樣荸百。
-
調(diào)用
函數(shù)指針調(diào)用也可以采用下面兩種形式:(*fptr)(); fptr();
這兩種調(diào)用方式完全一樣。第二種格式看上去和函數(shù)調(diào)用無異潮太。但是有些程序員傾向于使用第一種格式管搪,因為它明確指出是通過指針而非函數(shù)名來調(diào)用函數(shù)的。
函數(shù)指針就可以作為函數(shù)的參數(shù)铡买,這稱為回調(diào)函數(shù)。
示例
- 實現(xiàn)數(shù)組元素的和積差商的函數(shù)霎箍。
英語 | 漢語 | 英語 | 漢語 |
---|---|---|---|
add | 加 | sum | 和 |
subtract | 減 | difference | 差 |
multiply | 乘 | product | 積 |
divide | 除 | quotient | 商 |
- 使用函數(shù)
qsort()
實現(xiàn)數(shù)組的排序奇钞。
使用回調(diào)函數(shù)與使用普通函數(shù)不同,使用正常函數(shù)漂坏,我們可以確定傳入的參數(shù)景埃,但是使用回調(diào)函數(shù)是調(diào)用函數(shù)傳入?yún)?shù)。
2.3 指針函數(shù)
指針函數(shù)是指帶指針的函數(shù)顶别,即本質(zhì)是一個函數(shù)谷徙,函數(shù)返回類型是某一類型的指針。
類型 *函數(shù)名(參數(shù)表)
當(dāng)一個函數(shù)聲明其返回值為一個指針時驯绎,實際上就是返回一個地址給調(diào)用函數(shù)完慧,以用于需要指針或地址的表達(dá)式中。
函數(shù)返回的是一個地址值剩失,經(jīng)常使用在返回數(shù)組的某一元素地址上屈尼。
int * GetDate(int wk,int dy);
main(){
int wk,dy;
do{
printf(Enter week(1-5)day(1-7)\n);
scanf(%d%d,&wk,&dy);
}
while(wk<1||wk>5||dy<1||dy>7);
printf(%d\n,*GetDate(wk,dy));
}
int * GetDate(int wk,int dy){
static int calendar[5][7]= {
{1,2,3,4,5,6,7},
{8,9,10,11,12,13,14},
{15,16,17,18,19,20,21},
{22,23,24,25,26,27,28},
{29,30,31,-1}
};
return &calendar[wk-1][dy-1];
}
指針函數(shù)是函數(shù);函數(shù)指針是指針變量拴孤。