#include?stdio.h
專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)濟寧免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
#include?stdlib.h
#include?string.h
void?virtualFun(int?choice,?int?n,?char?*str[],?char?*(*p)(int?,?char?**));
char?*maxs(int?n,?char?*s[]);??//此函數(shù)通過指向函數(shù)的指針調(diào)用
char?*mins(int?n,?char?*s[]);??//此函數(shù)通過指向函數(shù)的指針調(diào)用
char?*minc(int?n,char?*s[]);???//此函數(shù)通過指向函數(shù)的指針調(diào)用
void?Menu();
char?*(*func)(int?n,?char?**);
int?main()?{
char?*name[]={"FOLLOW?ME","BASIC","GREAT?WALL?","FORTRAN","COMPUTER?DESIGN"};
int?n=5;
char?ch=0;
while?(ch!=4)?{
Menu();
ch?=?getchar();
getchar();//ignore?'\n'
ch?=?ch?-?'0';
virtualFun(ch,?n,?name,?func);
}
return?0;
}
void?virtualFun(int?choice,?int?n,?char?*str[],?char?*(*p)(int?n,?char?**name))?{
switch(choice)?{
case?1:?//max?string
p?=?maxs;
break;
case?2:
p?=?mins;
break;
case?3:
p?=?minc;
printf("[result?is?:%c]\n",?*p(n,?str));?//because?the?return?is?a?char
default:
return;
}
printf("[result?is?:%s]\n",?p(n,?str));
}
char?*maxs(int?n,?char?*s[])?{
int?i;
char?*max?=?s[0];
for?(i=1;in;i++)?{
if?(strcmp(max,?s[i])0)
max?=?s[i];
}
return?max;
}
char?*mins(int?n,?char?*s[])?{
int?i;
char?*min?=?s[0];
for?(i=1;in;i++)?{
if?(strcmp(min,?s[i])0)
min?=?s[i];
}
return?min;
}
char?*minc(int?n,?char?*s[])?{
int?i;
char?ch?=?s[0][0],?*p,?*r=s[0];
for?(i=0;in;i++)?{
p?=?s[i];
while(*p++)?{
if?(*p0x20??ch*p)?{
ch?=?*p;
r?=?p;
}
}
}
return?r;
}
void?Menu()?{
char?menu[]?=?"1??max?string\n\
2??min?string\n\
3??min?char?\n\
4??exit\n";
printf("%s",?menu);
}
c語言中叫做回調(diào)函數(shù),將函數(shù)指針(如max)作為函數(shù)的參數(shù),函數(shù)(如fun)中調(diào)用這個參數(shù)指向的函數(shù),
調(diào)用函數(shù)(fun)時看情況而給函數(shù)傳入不同的函數(shù)指針
例如fun(a,b,min),那么fun函數(shù)調(diào)用執(zhí)行三個參數(shù)就調(diào)用min函數(shù)
參數(shù)的定義要與傳入的函數(shù)指針相匹配
例如fun(int,x,int y,(*p)(int,int)) 那么調(diào)用fun(a,b,min)時,min的參數(shù)必須是(int ,int)
01
指針函數(shù)通常是指函數(shù)返回值是指針的一類函數(shù),如圖所示。
02
函數(shù)指針是指指向某個具體函數(shù)的指針變量,在程序設計時可以用來調(diào)用某個特定函數(shù)或者做某個函數(shù)的參數(shù)。其形式一般如圖:
03
指針函數(shù)與函數(shù)指針本質(zhì)上的區(qū)別是,指針函數(shù)是一個帶指針的函數(shù),總的來說還是一個函數(shù),如圖就是一個帶*name指針的函數(shù)
04
函數(shù)指針是指向函數(shù)的指針變量,本質(zhì)上還是一個指針,其格式如下,可以看到和指針函數(shù)的格式非常像,所以一定要用心留意。
函數(shù)指針就是一個函數(shù)的首地址,這個在匯編里面最好看明白了.
比如:int * a (int i, int j) ; 假設a的值是:0x3312FF80,,下面是匯編調(diào)用的例子.
push j
push i
call 0x33FF80
上面是調(diào)用方法,而int* a(int i, int j); 的返回值也很容易看出來,返回一個DWORD類型的一個指針而已.反匯編應該是 return n;這里的n是四個字節(jié),應為返回是一個指針類型,在32位下指針就是4字節(jié).
我有仔細研究了下你的問題,你是弄不明白 int* a() 和int (*p)() 嗎?還是別的什么意思?請繼續(xù)追問.
是否可以解決您的問題?