#includestdio.h
創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、和龍網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為和龍等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
int *d_bubblesort(int a[],int n)//數(shù)組長度為n的冒泡降序排序
{
int i,j;
int temp;
for(i=0;in;i++)
{
for(j=n-1;ji;j--)
{
if(a[j]a[j-1])
{
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
return a;
}
void main()
{
int i;
int *p=NULL;
int a[10]={6,5,4,1,2,3,9,8,7,10};
int *(*fun)(int*,int);
fun=d_bubblesort;
p=fun(a,10);
for(i=0;i10;i++)
{
printf("%d\t",p[i]);
}
}
第一條紅線是定義一個函數(shù)指針;
第二條紅線起強轉(zhuǎn)作用,把0xd010f0強轉(zhuǎn)為對應(yīng)的函數(shù)指針類型
我寫的這個程序可以幫你理解...常量地址被printab取代~
有函數(shù): int fun(int a,int b);\x0d\x0a要定義指向該函數(shù)的指針\x0d\x0a對比指向 int a; 的指針\x0d\x0aint *p; p = a;\x0d\x0ap的定義是怎么來的?\x0d\x0a首先要保證p是一個指針類型\x0d\x0a寫下(*p),\x0d\x0a然后,考慮下p的基類型,\x0d\x0ap的基類型就是變量a的類型int\x0d\x0a將int 放在(*p)前面就行了\x0d\x0aint (*p); \x0d\x0a括號可以省略,就成了 int *p;\x0d\x0a\x0d\x0a同理\x0d\x0a想要實現(xiàn) pf = fun;\x0d\x0a(*pf) 將pf定義為一個指針,\x0d\x0a將fun的類型作為pf的基類型\x0d\x0afun相當(dāng)于一個 int (int a,int b)類型的量\x0d\x0aint (int a,int b) (*pf);\x0d\x0a基類型中有圓括號和中括號要后移\x0d\x0aint (*pf)(int a,int b) ;//括號不能省略\x0d\x0apf = fun;\x0d\x0a調(diào)用時\x0d\x0a(*pf)(3,4); pf(3,4)都可以
整個程序的目的是對一組數(shù)據(jù)進行求最大值、最小值或平均值的操作,通過輸入的指令進行相應(yīng)的操作。按照不用函數(shù)指針的思路,程序大概會寫成這樣:(以下為偽代碼)
最大值函數(shù){...}
最小值函數(shù){...}
平均值函數(shù){...}
main{
輸入d,則調(diào)用 最大值函數(shù)
輸入x,則調(diào)用 最小值函數(shù)
輸入p,則調(diào)用平均值函數(shù)
}
不過可以發(fā)現(xiàn)如下幾點:
· 三個函數(shù)的參數(shù)形式與返回值都是完全一樣的
· 按上述方法寫代碼,每次調(diào)用都要寫清楚參數(shù),略顯啰嗦
所以就使用函數(shù)指針來重新改寫代碼
GetOperation這個函數(shù)本身,就是根據(jù)輸入指令找到對應(yīng)的 操作函數(shù)并作為函數(shù)指針返回它,然后main里直接通過函數(shù)指針調(diào)用,調(diào)用代碼只需要寫一次,而且甚至不用關(guān)心這個函數(shù)指針代表的到底是哪個函數(shù)
這個程序里只有三個對數(shù)據(jù)的操作所以函數(shù)指針的優(yōu)點不是很明顯。假設(shè)有多大100種對數(shù)據(jù)的操作,如果不使用函數(shù)指針,就要不停地寫if else if else if...,使用函數(shù)指針,甚至可以事先建立一個指令字符與操作函數(shù)指針的對應(yīng)列表,運行時直接在列表里搜索抽取,代碼就顯得干凈利索
GetOperation(c)(dbData,iSize)這句話的具體執(zhí)行操作是:
(下面假設(shè)輸入了c='d')
首先執(zhí)行GetOperation('d'),該函數(shù)返回得到GetMax(的指針),再執(zhí)行GetMax(bData,iSize),即對數(shù)據(jù)求最大值的操作,函數(shù)返回得到最大值
1樓感覺對函數(shù)指針不是很了解,就不評論了. 2樓的基本還可以,但是int (*p)(),然后讓它指向max函數(shù),一個包含兩個未知量的函數(shù),這在后來的標準c里面是不支持的好像. 3樓吧,那么多*,感覺有點不大對. *是取內(nèi)容,連著那么* ,我沒試過,沒有多少意義至少.他11級了,應(yīng)該也不會怎么有錯,你可以試試(我不打算加那么多*, 就不調(diào)試了).
程序里面對函數(shù)的調(diào)用,就是通過函數(shù)的入口地址,然轉(zhuǎn)入函數(shù). 這樣的話,函數(shù)指針的意義就明顯了.函數(shù)指針指向了函數(shù)的入口,即函數(shù)指針里是函數(shù)的入口地址. 指針不能指向函數(shù)這種說法肯定是不對的.話說回來,1樓的老兄可能看錯書了,或者記錯了.
類型匹配很重要,二樓的聲明和使用不一致,這在老版的編譯器里也是支持的.那時候ANSI標準還沒有制定出來.現(xiàn)在而言,這種定義應(yīng)該不被支持了才是.
那個聲明應(yīng)該如下:
int (*p)(int , int);
這樣才能指向
int name(int,int)型的函數(shù).么有實驗過,但按這種寫法是不錯的肯定.
三樓那個********p,怎么都覺得不對.