函数指针

函数指针:
int (*p)(int x, int y)

函数名代表首地址


    // 声明了一个返回值为 int, 拥有两个整型参数的函数指针 p
   
// 指针的类型是 int (*)(int, int)
   
int (*p)( int a, int b) = NULL ;
   
// 函数名就是地址,当指针与函数建立指向关系之后,我们就可以用指针代替函数名进行操作。
    p =
sum ;
   
printf ( "%d" , p( 2 , 4 ));
    p =
maxValue ;
   
// 如果函数的类型与函数指针的类型完全相同,那么可以用一个函数指针指向多个函数。(指针重指向)
   
//int (*p2)(int a, int b) = maxValue;
    printf("%d", p(5, 8));

// 使用 typedef 给指定变量重新起一个新名字,新的名字还写在指针名的位置,覆盖掉原来的名字。
   
typedef int   (*CF)( int a, int b); //typedef 只是声明了一个类型,真正需要使用该指针变量的时候要创建一个函数指针变量。
    CF cf = sum;// 创建一个 CF 类型的函数指针变量 cf
#import <Foundation/Foundation.h>
int sum( int x, int y);
int sum( int x, int y){
   
return x + y;
}
int maxValue( int a, int b);
int maxValue( int a, int b){
   
return a > b ? a : b;
}
int main( int argc, const char * argv[]) {
    int (*p)(int a, int b) = sum;//函数名就是地址,不用写后面的参数
   
int x = p(30, 20
);
   
printf ( "%d" , x);
   
return 0 ;
}


#import <Foundation/Foundation.h>
typedef int (*PFUN)( int , int );
// 相当于把 int (*)(int, int) 改成了 PFUN ,之后就可以使用 PFUN 代替整个
int sum( int x, int y);
int sum( int x, int y){
   
return x + y;
}
int maxValue( int a, int b);
int maxValue( int a, int b){
   
return a > b ? a : b;
}
int main( int argc, const char * argv[]) {
    PFUN p = NULL;
    p =
sum
;
   
int x = p( 30 , 20 );
    printf("%d", x);
    return 0 ;
}


.m
void printHello(){
   
printf ( "Hello!" );
}
void print( PH ph){
    ph();
}
.h
typedef void (*PH)();
void printHello();
void print( PH ph);
main.m
print ( printHello );


用函数回调找出一个学生结构体中分数高于90的学生,在名字后面添加 高富帅 三个字
.h
void addStr( char *name); // 名字加高富帅

void findStudentByScore( Student *stu, int count, void (*p)( char *)); // 遍历比较学生的分数,查找出高于 90 分的回调 addStr 函数

void pringAllStudent( Student *a, int count); // 输出所有学生信息
.m
void addStr( char *name){
   
strcat (name, "---- 高富帅 " );

}
void findStudentByScore( Student *stu, int count, void (*p)( char *)){
   
for ( int i = 0 ; i < count; i++) {
       
if (stu[i]. score > 90 ) {
            p(stu[i].
name );
        }
    }
}
void pringAllStudent( Student *a, int count){
   
for ( int i = 0 ; i < count; i++) {
       
printf ( "%s %d %c %.2f\n" , a[i]. name , a[i]. age , a[i]. sex , a[i]. score );
    }
}
main.m
Student stu[] = {
        {
"maomao" , 20 , 'm' , 89 },
        {
"paopao" , 21 , 'f' , 91 },
        {
"huahua" , 36 , 'm' , 96 },
        {
"lulu" , 23 , 'f' , 85 },
        {
"ganggang" , 58 , 'm' , 55 }
    };    
    findStudentByScore (stu, 5 , addStr );
    pringAllStudent(stu, 5);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值