函数指针:指向函数的指针变量.
函数名相当于首地址. 函数指针定义:返回值类型 &*bsp;(*函数指针变量名)(参数类型1,参数类型2,....)=初始值 函数指针类型:返回值类型 &*bsp;(*)(参数类型1,参数类型2,....)=初始值 如:**t &*bsp;(*)(**t **t) &*bsp;表示返回值是**t类型,参数有两个,都为**t类型的指针变量类型 vo*d sayHello(){ pr**tf("你好!!! \*"); } vo*d (*p)()=NULL; &*bsp; //表示返回值为空,无参数的,函数指针变量名是p的函数指针 p=sayHello; &*bsp; &*bsp;//因为函数名就是地址,就是把函数名赋值给函数指针变量p 函数指针在指向相应地址后可以只用()调用函数
给函数指针类型起别名 typedef &*bsp;返回值(*新类型名)(参数类型1,参数类型2...) 如:typedef **t(*FUN)(**t,**t) &*bsp;表示给**t (*)(**t,**t) 起了个别名FUN
函数回调:用函数指针来调用函数 如:


#*mport&*bsp;<Fou*dat*o*/Fou*dat*o*.h&*t;

//定义一个结构体,使用函数回调实现动态排序(年龄.姓名.分数)

typedef&*bsp;struct&*bsp;stude*t{

&*bsp; &*bsp;&*bsp;char&*bsp;*ame[50];

&*bsp; &*bsp;&*bsp;**t&*bsp;a*e;

&*bsp; &*bsp;&*bsp;float&*bsp;score;

}Stude*t;

BOOL&*bsp;compareName(Stude*t&*bsp;stu1,Stude*t&*bsp;stu2);&*bsp;&*bsp;//声明

BOOL&*bsp;compareName(Stude*t&*bsp;stu1,Stude*t&*bsp;stu2){&*bsp;&*bsp;//按姓名排序实现

&*bsp; &*bsp;&*bsp;retur*&*bsp;strcmp(stu1.*ame, stu2.*ame);

}

BOOL&*bsp;compareA*e(Stude*t&*bsp;stu1,Stude*t&*bsp;stu2); &*bsp;&*bsp;//声明

BOOL&*bsp;compareA*e(Stude*t&*bsp;stu1,Stude*t&*bsp;stu2){ &*bsp;&*bsp;//按年龄排序实现

&*bsp; &*bsp;&*bsp;retur*&*bsp;stu1.a*e&*t;stu2.a*e?YES:NO;

}

BOOL&*bsp;compareScore(Stude*t&*bsp;stu1,Stude*t&*bsp;stu2); &*bsp;&*bsp;//声明

BOOL&*bsp;compareScore(Stude*t&*bsp;stu1,Stude*t&*bsp;stu2){ &*bsp;&*bsp;//按分数排序实现

&*bsp; &*bsp;&*bsp;retur*&*bsp;stu1.score&*t;stu2.score?YES:NO;

}

vo*d&*bsp;bubbleArray(Stude*t&*bsp;*a,**t&*bsp;cou*t,BOOL&*bsp;(*p)(Stude*t,Stude*t));

vo*d&*bsp;bubbleArray(Stude*t&*bsp;*a,**t&*bsp;cou*t,BOOL&*bsp;(*p)(Stude*t,Stude*t)){&*bsp; &*bsp;&*bsp;//运行时函数,参数:一个指针变量,一个长度,一个函数指针

&*bsp; &*bsp;&*bsp;for&*bsp;(**t&*bsp;*=0; *<cou*t-1; *++) {

&*bsp; &*bsp; &*bsp; &*bsp;&*bsp;for&*bsp;(**t&*bsp;j=0; j<cou*t-1-*; j++) {

&*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp;&*bsp;*f&*bsp;(p(a[ j ],a[j+1])) {&*bsp; &*bsp;&*bsp;//由参数函数指针所指向的函数决定按什么类型排序

&*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp;&*bsp;Stude*t&*bsp;temp=a [ j ];

&*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; a[ j ]=a[j+1];

&*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; a[j+1]=temp;

&*bsp; &*bsp; &*bsp; &*bsp; &*bsp; &*bsp; }

&*bsp; &*bsp; &*bsp; &*bsp; }

&*bsp; &*bsp; }

&*bsp; &*bsp;&*bsp;for&*bsp;(**t&*bsp;*=0; *<cou*t; *++) { &*bsp;&*bsp;//遍历

&*bsp; &*bsp; &*bsp; &*bsp;&*bsp;pr**tf("%s %d %.2f \*",a[ * ].*ame,a[ * ].a*e,a[ * ].score);

&*bsp; &*bsp; }

}

**t&*bsp;ma**(**t&*bsp;ar*c,&*bsp;co*st&*bsp;char&*bsp;* ar*v[]) {

&*bsp; &*bsp;&*bsp;Stude*t&*bsp;stuArray[&*bsp;5&*bsp;]={ &*bsp;&*bsp;//定义一个结构体数组

&*bsp; &*bsp; &*bsp; &*bsp; {"x*j**p***",98,80.0},

&*bsp; &*bsp; &*bsp; &*bsp; {"aobama",75,60.1},

&*bsp; &*bsp; &*bsp; &*bsp; {"be*lade**",55,56.3},

&*bsp; &*bsp; &*bsp; &*bsp; {"puj***",58,88.6},

&*bsp; &*bsp; &*bsp; &*bsp; {"che***ua*",63,98.0}

&*bsp; &*bsp; };

&*bsp; &*bsp;&*bsp;BOOL&*bsp;(*p)(Stude*t,Stude*t)=NULL;&*bsp; &*bsp;&*bsp;//函数指针初始化

&*bsp; &*bsp; p=compareA*e; &*bsp; &*bsp;&*bsp;//为函数指针赋值,指向的是函数compareA*e的地址

&*bsp; &*bsp;&*bsp;//&*bsp; &*bsp; p=compareName;

&*bsp; &*bsp;&*bsp;//&*bsp; &*bsp; p=compareScore;

&*bsp; &*bsp;&*bsp;bubbleArray(stuArray,&*bsp;5, p); &*bsp;&*bsp;//调用函数

&*bsp; &*bsp;&*bsp;retur*&*bsp;0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。