首页 > 编程知识 正文

回调函数作为成员函数,回调函数和函数指针的区别

时间:2023-05-05 13:45:44 阅读:61803 作者:2912

注:()的优先级高于*。

一.指针函数1 .定义:指针函数实质为函数,与普通函数相同,但普通函数有返回类型,无返回值则为无值类型。

2 .一般格式:类型名称*函数名称(函数参数列表);例如:

int*fun(inta,int b ); int*fun(inta,int b ); int*fun(inta,int b ); //都定义了指针函数,具体写法因人而异。 此代码定义了返回类型为int *类型的指针函数。

3 .例: # include stdio.h char * strcpy (char * S1,char *s2 ) ) char*P=S1; 用p保存在//S1中接收到的实参字符数组的起始地址while () S1=) S2 ); //S2指向“ 0”时,返回p先完成赋值,循环结束; //以函数名称返回指针值(int main void ) ) { char s[20]; printf('%sn ',strcpy(s,' Welcome to you!' ); return 0,输出返回值指示的内容; } 输出结果:

欢迎加入!

2 .函数指针1 .定义:函数指针的本质是指针变量,该指针指向该函数。 简而言之,函数指针是指向函数的指针。

2 .一般类型:类型名称(*指针变量名称) )函数参数列表);例如:

int(*fun ) ) int a,int b ); 此代码定义指向名为fun的函数的指针,指向int类型的函数,然后传递两个int类型的变量。

3 .说明:定义指向函数的指针变量,并不意味着这个指针变量可以指向任何函数,它只能指向在定义时指定的类型的函数。如:

int(*p ) int,int )指针变量p表示函数返回值为整数,可以是具有两个整数参数的函数。 在程序中,如果给哪个函数分配了地址,也就是说,该函数的值是整数,并且有两个整数参数,它指的是哪个函数?

在一个程序中,一个指针变量可以先后指向同类型的不同函数。

如果要用指针调用函数,必须先使指针变量指向该函数。如:

p=max;

这将为指针变量p分配max函数的条目地址。

在给函数指针变量赋值时,只须给出函数名而不必给出参数。例如:

p=max; //将函数的条目地址分配给p

因为将函数入口的地址分配给p,不涉及实际参加形参的结合问题。 写了之后

p=max(a,b );

错了。 p=max(a,b )的作用是通过调用max函数而获得的函数值分配给p,而不是将函数的入口地址分配给p。

用函数指针变量调用函数时,可以用(p )代替函数名称,) p是指针变量名称),并在(p )后的括号内根据需要写实参。 例如,c=(*p () a,b );

“调用用p指示的函数,实参为a、b。 得到的函数值给c”。

请注意函数的返回类型。 从指针变量p的定义可以看出,函数的返回值必须是整数,所以将该值分配给整数变量c是合法的。

对指向函数的指针变量不能进行算数运算,如:p + n, p++, p等运算是无意义的。

用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数。

4 .例: # include stdio.h # include stdlib.hint add (intx,int y ) ) returnxy; }intsub(intx,int y ) { return x - y; (int ) f ) ) int x,int y ); //函数指针intmain(void ) { f=add; printf(%d(n ),(f ) ) ) 1,2 ); f=子; printf(%d(n ),(f ) ) ) 1,2 ); 返回0; } 5.回调函数(将指向函数的指针作为函数参数)指向函数的指针变量的一个重要用途是把函数的入口地址作为参数传递到其它函数。

指向函数的指针用作函数参数,并且通过将函数的条目地址传递给参数,可以将参数用于调用的函数。 其原理可以简单说明如下

函数名为fun,具有x1和x2两个参数,将x1和x2定义为指向函数

指针变量。在调用函数fun时,实参为两个函数名f1和f2,给形参传递的是函数f1和f2的入口地址。这样在函数fun中就可以调用f1和f2函数了。

例如:

void fun(int (*x1)(int), int(*x2)(int, int)) { //定义fun函数,形参是指向函数的指针变量 int a, b, i = 3, j = 5; a = (*x1)(i); //调用f1函数,i是实参 b = (*x2)(i, j); //调用f2函数,i,j是实参}

优点:
灵活性高。 调用的函数可以不固定,只要在每次调用fun函数时给出不同的函数名作为实参即可,fun函数不必做任何修改。

示例:
求自然数1~n的奇数或偶数和,用指向函数的指针变量作为函数的参数。

#include <stdio.h>int evensum(int n) { int i, sum = 0; for (i = 2; i <= n; i += 2) { sum += i; } return sum;} //求自然数1~n中偶数的和int oddsum(int n) { int i ,sum = 0; for (i = 1; i <= n; i += 2) { sum += i; } return sum;} //求自然数1~n中奇数的和int result(int n, int (*p)(int)) { //参数p为指向函数的指针变量 int sum; sum = (*p)(n); //调用p所指向的函数 return sum;}int main(void) { int n, sum, flag; printf("input n:n"); scanf("%d", &n); printf("input flag(0 or 1):n");//输入0表示求偶数和,1表示求奇数和 scanf("%d", &flag); if (flag == 1) { sum = result(n, oddsum); } else { sum = result(n, evensum); } printf("sum = %dn", sum); return 0;} 三.指针函数和函数指针的区别 主体需求基本定义形式指针函数函数返回类型为指针类型名 *函数名(函数传参列表);函数指针指针指向一个函数类型名 (*指针变量名)(函数传参列表);

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。