如何理解typedef函數(shù)指針?
1、什么是函數(shù)指針
????????函數(shù)指針是函數(shù)指針變量的簡(jiǎn)稱,其實(shí)質(zhì)是一個(gè)變量,就像 ? int a;
?中的a一樣,指針即地址,所以函數(shù)指針可以理解為“存放函數(shù)入口地址的變量”。舉個(gè)栗子:
int sum(int a, int b)
{
? ?return (a+b);
}
void main()
{
????????int (*p)(int, int);
? ? //定義了一個(gè)函數(shù)指針P
????????int a = 0;
????????p = sum;
????????a = (*p)(10,20);
????????printf(”%d\\n”,a);
}
????????代碼中,語(yǔ)句int (*p)(int, int);
定義了一個(gè)函數(shù)指針變量p,它指向的函數(shù)返回值類型為int,函數(shù)的參數(shù)為兩個(gè)int型。換句話說(shuō),變量p可以存返回值為int,形參為兩個(gè)int型的函數(shù)的地址,上例中就是把函數(shù)sum的地址(即函數(shù)名)賦給了p;
2、函數(shù)指針的數(shù)據(jù)類型
????????我們知道C語(yǔ)言中的變量都有其對(duì)應(yīng)的數(shù)據(jù)類型,比如:int a = 0
; ? char b;
其中變量a的數(shù)據(jù)類型為int,變量b的數(shù)據(jù)類型為char,那么int (*p)(int, int);
中變量p的數(shù)據(jù)類型是什么?這里p 的數(shù)據(jù)類型就是int (*)(int, int)
,是的,就是把p去掉,剩下的就是數(shù)據(jù)類型。
????????現(xiàn)在再來(lái)理解typedef函數(shù)指針。
??比如,typedef int (*abc)(int, int);
這里是定義數(shù)據(jù)類型int (*)(int, int)
為別名abc
,即可以用abc
表示數(shù)據(jù)類型int (*)(int, int)
了。如何使用?再舉個(gè)栗子:
typedef int (*alias)(int, int);
int sum(int a, int b)
{
??return (a+ b);
}
void main()
{
????????alias p = sum;
????????int a = 0;
????????a = (*p)(10,20);
????????printf(”%d\\n”,a);
}
代碼第一行重新定義了函數(shù)指針數(shù)據(jù)類型int (*)(int, int)
為alias
,然后在main函數(shù)中用該類型別名alias
?定義了函數(shù)指針p,運(yùn)行結(jié)果和上個(gè)例子中一樣。
舉一反一,typedef數(shù)組指針也類似。