ARM:函數指針(zhen)
時(shi)間:2018-12-26 來源:華清(qing)遠見
首先要了解指針函(han)數與函(han)數指針的區別:
在學習C語言(yan)時候發現這“指(zhi)針(zhen)函數”與“函數指(zhi)針(zhen)”容易搞(gao)錯,最簡(jian)單的辨別方式就(jiu)是看函數名前面的指(zhi)針(zhen)*號(hao)有沒有被括號(hao)()包(bao)含,如果被包(bao)含就(jiu)是函數指(zhi)針(zhen),反(fan)之(zhi)則(ze)是指(zhi)針(zhen)函數。
下面我們(men)來具體(ti)談談他們(men)的區別以及辨別方法.
首先從他們定義來看:
1、指針(zhen)函(han)數(shu)是(shi)(shi)指帶(dai)指針(zhen)的(de)函(han)數(shu),本(ben)質是(shi)(shi)一(yi)個函(han)數(shu),函(han)數(shu)返回類型(xing)是(shi)(shi)某一(yi)類型(xing)的(de)指針(zhen)。
類(lei)型標識符 *函數(shu)(shu)名(參數(shu)(shu)表)
int *function(x,y);
首先它是(shi)一(yi)個函數(shu),只不過這(zhe)個函數(shu)的返回值(zhi)(zhi)(zhi)是(shi)一(yi)個地(di)址值(zhi)(zhi)(zhi)。函數(shu)返回值(zhi)(zhi)(zhi)必須用同類(lei)型的指針(zhen)變(bian)量來(lai)接受(shou),也就(jiu)是(shi)說,指針(zhen)函數(shu)一(yi)定有函數(shu)返回值(zhi)(zhi)(zhi),而且在主調函數(shu)中,函數(shu)返回值(zhi)(zhi)(zhi)必須賦給同類(lei)型的指針(zhen)變(bian)量。
表示:
int *fun();
int *p;
p = fun(a);
注意指(zhi)針(zhen)函數與函數指(zhi)針(zhen)表示方法的不同(tong),千萬不要(yao)混淆。
指針函數:
當一個函(han)數(shu)聲明其(qi)返(fan)回值為一個指(zhi)針時,實際上就(jiu)是返(fan)回一個地(di)址(zhi)(zhi)給調(diao)用(yong)函(han)數(shu),以用(yong)于需(xu)要指(zhi)針或地(di)址(zhi)(zhi)的表(biao)達式(shi)中。
格式如下:
類(lei)型說明符(fu) * 函數名(參數)
當然了(le),由于(yu)返回的是(shi)一(yi)個地址(zhi),所(suo)以類型(xing)說明符(fu)一(yi)般都是(shi)int。
例如:
int *GetDate();
int *getValue(int, float);
函(han)數(shu)返回(hui)的(de)是一個地址值,經常使(shi)用(yong)在(zai)返回(hui)數(shu)組的(de)某(mou)一元素(su)地址上。
int *GetDate(int wk,int dy);
int main()
{
int wk, dy;
do
{
printf(Enter week(1-5)day(1-7)\n);
}
while(wk<1||wk>5||dy<1||dy>7);
printf(%d\n,*GetDate(wk,dy));
return 0;
}
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];
}
程(cheng)序應該是(shi)很好理(li)解的(de),子函數(shu)返回的(de)是(shi)數(shu)組(zu)某元素(su)的(de)地址(zhi)。輸出的(de)是(shi)這(zhe)個(ge)地址(zhi)里的(de)值。
2、函數(shu)指針是(shi)(shi)指向函數(shu)的(de)指針變量,即本(ben)質(zhi)是(shi)(shi)一個指針變量。
int (*f) (int x); // 聲明一個函數(shu)指(zhi)針(zhen)
f = func; // 將func函數的首地址(zhi)賦給指(zhi)針(zhen)f
指(zhi)向函(han)數(shu)的指(zhi)針包含(han)了函(han)數(shu)的地址的入口地址,可以通過(guo)它來調用(yong)函(han)數(shu)。格式如下:
類型說明符 (*函數(shu)名) (參數(shu))
其實(shi)這里(li)不(bu)能稱為函數(shu)名,應(ying)該叫(jiao)做指針的變量名。這個特殊(shu)的指針指向一個返回(hui)整型值的函數(shu)。指針的聲(sheng)明筆削和(he)它指向函數(shu)的聲(sheng)明保持一致。
指針(zhen)名和指針(zhen)運算符(fu)外面的(de)括(kuo)號改(gai)變了默(mo)認的(de)運算符(fu)優(you)先(xian)級(ji)。如(ru)果沒有(you)圓括(kuo)號,就變成了一個返回整型指針(zhen)的(de)函數(shu)的(de)原型聲明。
例如:
void (*fptr)();
把函數的地址賦值(zhi)給函數指針,可以采用下面兩種形式:
Fptr = &Function;
fptr = Function;
取地址(zhi)(zhi)運算符&不是必需的,因為單單一個函數標(biao)識符就(jiu)標(biao)號表(biao)示了它(ta)的地址(zhi)(zhi),如果(guo)是函數調用(yong),還(huan)必須包含(han)一個圓(yuan)括號括起來的參(can)數表(biao)。
可以采用如下兩種方(fang)式來(lai)通(tong)過指針調用函數(shu):
X = (*fptr)();
X = fptr();
第(di)二(er)種格(ge)式(shi)看上去和函數(shu)調用(yong)(yong)(yong)無(wu)異。但是有些程序員傾(qing)向于使(shi)用(yong)(yong)(yong)第(di)一(yi)種格(ge)式(shi),因為它明確指(zhi)出是通過指(zhi)針而非函數(shu)名來調用(yong)(yong)(yong)函數(shu)的。
看下(xia)面這個例(li)子:
void (*funcp)();
void FileFunc();
void EditFunc();
int main()
{
funcp=FileFunc;
(*funcp)();
funcp=EditFunc;
(*funcp)();
return 0;
}
void FileFunc()
{
printf(FileFunc\n);
}
void EditFunc()
{
printf(EditFunc\n);
}
程序輸出為:
FileFunc
EditFunc
綜上所述,函(han)數(shu)指針和指針函(han)數(shu)的(de)主要的(de)區別(bie)是:
指針(zhen)函數本(ben)質(zhi)上是一個函數,函數指針(zhen)本(ben)質(zhi)上是一個指針(zhen)變量。