C語(yǔ)言中函數(shù)指針與普通指針沒(méi)什么差別,只是指向的內(nèi)容不同而已。主要作用:
創(chuàng)新互聯(lián)擁有10多年成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、成都App制作、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、國(guó)際域名空間等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷(xiāo)、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類(lèi)型的網(wǎng)站建設(shè)項(xiàng)目的能力。
1、實(shí)現(xiàn)面向?qū)ο缶幊讨械亩鄳B(tài)性。
2、回調(diào)函數(shù)。
函數(shù)指針是指向函數(shù)的指針變量。 因此“函數(shù)指針”本身首先應(yīng)是指針變量,只不過(guò)該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。
C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂?。有了指向函?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類(lèi)型變量一樣,在這些概念上是大體一致的。
函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
#include
stdio.h
void
main()
{
int
max(int
,int
);
int
(*p)(int
,int);
p=max;
//此處利用
p=max是正確的指向函數(shù)的指針的用法,p指向max的入口地址
//此處用*p=max得到相同結(jié)論,為什么呢?因?yàn)槟氵@樣賦值之后*p的內(nèi)容就是max
//所以在執(zhí)行(*p)(q,w)它時(shí)其實(shí)是執(zhí)行的(max)(q,w),如果是p=max此時(shí)執(zhí)行(*p)(q,w)是等價(jià)于執(zhí)行max(q,w)。
int
q,w;
printf("please
input
the
two
numbers:\n");
scanf("%d%d",q,w);
printf("the
larger
number
is:%d",(*p)(q,w));
}
////////////////////////////////////
int
max(int
a,int
b)
{
if(ab)
return
a;
else
return
b;
}
c語(yǔ)言中叫做回調(diào)函數(shù),將函數(shù)指針(如max)作為函數(shù)的參數(shù),函數(shù)(如fun)中調(diào)用這個(gè)參數(shù)指向的函數(shù),
調(diào)用函數(shù)(fun)時(shí)看情況而給函數(shù)傳入不同的函數(shù)指針
例如fun(a,b,min),那么fun函數(shù)調(diào)用執(zhí)行三個(gè)參數(shù)就調(diào)用min函數(shù)
參數(shù)的定義要與傳入的函數(shù)指針相匹配
例如fun(int,x,int y,(*p)(int,int)) 那么調(diào)用fun(a,b,min)時(shí),min的參數(shù)必須是(int ,int)
#include?stdio.h
#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ù)通過(guò)指向函數(shù)的指針調(diào)用
char?*mins(int?n,?char?*s[]);??//此函數(shù)通過(guò)指向函數(shù)的指針調(diào)用
char?*minc(int?n,char?*s[]);???//此函數(shù)通過(guò)指向函數(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);
}
選B
f是一個(gè)變量,不是函數(shù)名字,所以不選D
int* f;這樣才是指向int類(lèi)型的指針,所以A錯(cuò)