今天是c语言学习的最后一天。
//输入一段字符串,将其中所有小写字符转换成大写,用回调函数实现。(修改单词功能写成回调函数)。
1.函数指针
函数指针的定义方式: 返回值类型 (*函数指针名称) (函数的参数)
例子:
float (* avg_num1_num2)(int ,int );
同时也可以对函数指针进行typedef ,如对上面的函数指针进行typedef,什么时候要进行typedef呢?
应该是有好多个函数,要对多个函数提取共性,使用共性,来创建函数指针,让指针的指向地址不同(即不同的函数名称赋给指针)
举例说明:
int add_value (int num1,int num2) { return num1 + num2; } int dele_value (int num1 ,int num2) { return num1 - num2; } int div_value (int num1 ,int num2) { return num1/num2; } int times_value (int num1 ,int num2) { return num1 * num2; }
可以看到,这几个函数都有一个共同的特征,就是返回值都是int 类型,传入的参数都是两个int类型,在这里我们可以声明一个函数指针
int (*p)(int ,int );我们使用typedef后为:
typedef int (*Calc)(int ,int );
然后就可以这样使用了,Calc c1=times_value;
使times_value函数地址存到 c1 中,c1指向times_value;
给出一个综合的例子
例子的要求是:定义一个学生的结构体,包括年龄,姓名,成绩,从控制台输入1--3,调用不同的方法,来实现可以按照成绩,年龄,姓名进行排序。比如当输入1的时候,函数会进行排序,在控制台上会输出按照年龄排序排好的结果打印。
typedef struct stu{ char name[23]; int age; float score; }student; typedef int (*pfun)(student stu1,student stu2); int main () { void sorting_by(student stus[], int len ,pfun p); int compare_age(student stu1,student stu2); int compare_score(student stu1,student stu2); int compare_name(student stu1,student stu2); void print_info (student stus[], int len );//声明打印函数 student stus[5]={{"zhangsan",24,92.0},{"zhangsan1",25,70.0},{"whangsan2",26,50.0},{"shangsan3",27,76.0},{"zhangsan4",28,90.0}}; //==========----------------------------------------------====================== printf("请输入1--3的数字, "); int i; scanf("%d",&i); printf ("%d ",i); pfun p[3] = {compare_age,compare_score,compare_name};//函数指针类型的数组,pfun 是类型, p[0],p[1],p[2]中分别存得是每个函数的地址通过函数指针可以调用相应的函数。 sorting_by(stus,5,p[i-1]);//这里使用了函数的回调机制。通过调用不同的函数指针,使用不同的函数。 print_info (stus,5); return 0; }
///////////////////////////////////////////////////
int compare_age(student stu1,student stu2)
{
return stu1.age -stu2.age;
}
int compare_score(student stu1,student stu2)
{
return stu1.score -stu2.score;
}
int compare_name(student stu1,student stu2)
{
return strcmp(stu1.name,stu2.name);
}
////////////////////////////////////////////////////
void sorting_by(student stus[], int len ,pfun p) { student temp; for(int i = 0 ;i < len ; i ++)//在这里是使用的选择法排序。 { for (int j = i ; j< len ;j ++) { if (p(stus[i],stus[j])>0) { temp = stus[i]; stus[i]=stus[j]; stus[j]= temp; } } } } /////////////////////打印数组//////////////////////////////// void print_info (student stus[], int len ) { for (int i = 0 ;i < len ;i ++) { printf("%s %d %.2f ",stus[i].name,stus[i].age, stus[i].score); printf(" "); } printf(" "); }
分析这段代码,
2.回调函数
上面也提到了函数回调,什么事函数回调呢?
定义为:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
含义:因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。