C语言--函数指针和回调函数

函数指针和回调函数的使用.充分体会到了指针的灵活性.

主要是掌握以下几点:1.看懂语法 

2.会定义指向函数的指针,(*p)是函数指针的固定写法,小括号必不可少,函数返回值类型+(*p)+(形参)

3.掌握如何利用指针调用函数,有两种方法 1>  p();  2>(*p)();

4.会使用回调函数,用函数指针作为函数的参数,实现需求不稳定时候,程序修改起来更加便捷

例如如下的程序中第1题,如果想改变一下程序要求,将5的倍数变为0输出,可将函数指针重指向给change_3就好了,第2题如果想输出数组A的值都小于B,则将函数指针指向change_4,不需要其他修改.函数回调非常适用于被调用的函数不确定的情况.比如某些条件下指向函数A,某些情况指向函数B.又比如说动态排序.总而言之,函数指针和函数回调使程序非常灵活.

#import <Foundation/Foundation.h>

#import "Function.h"

int change_1(int a){

   return (a%3) ==0 ?0: a;

}//3的倍数替换为0

int change_3(int a){

   return (a%5) ==0 ? 0: a;

}//5的倍数替换为0


void printArray(int a[],int count,CHANGE_1 p){

   for (int i =0; i < count; i++) {

        a[i] = p(a[i]);

       printf("%-3d ",a[i]);

    }

}


void change_2(int *p1,int *p2){

   if (*p1 > *p2) {

       int temp = *p1;

        *p1 = *p2;

        *p2 = temp;

    }

}//保证前者<后者

void change_4(int *p1,int *p2){

   if (*p1 < *p2) {

       int temp = *p1;

        *p1 = *p2;

        *p2 = temp;

    }

}


void printAB(int a[],int b[],int count,CHANGE_2 p){

   for (int i =0; i < count; i++) {

        p(&a[i], &b[i]);

    }

   for (int i =0 ; i < count; i++) {

       printf("a[%d]:%d\t",i,a[i]);

       printf("b[%d]:%d\t",i,b[i]);

       printf("\n");

    }

}


int main(int argc,constchar * argv[])

{

//1.(***)随机生成一个 10个元素的数组,找到 3的倍数,并将其值修改成 0.(注意:修改数值使用回掉函数处理)

   int a[10] = {0};

    printf("处理前数组:\n");

   for (int i =0; i < 10 ; i++) {

        a[i] =arc4random_uniform(101);

       printf("%-3d ",a[i]);

    }

    printf("\n处理后数组:\n");

   CHANGE_1 p = change_1;

   int count = sizeof(a)/sizeof(int);

   printArray(a, count, p);

    printf("\n================================\n");




    //2. (***)有两个10个元素的数组,分别为AB,编程实现相同位置的元素,如果 B 的元素小于 A的元素进行数值交换:(使用回调函数实现)

   int A[10] = {0};

   int B[10] = {0};

    printf("原始数组:\n");

   for (int i =0; i < 10 ; i++) {

        A[i] =arc4random_uniform(101);

       printf("a[%d]:%-3d\t",i,A[i]);

        B[i] =arc4random_uniform(101);

       printf("b[%d]:%-3d\t",i,B[i]);

       printf("\n");


    }

    printf("\n改变后数组:\n");

   CHANGE_2 P = change_2;

   printAB(A, B, 10, P);


   return 0;

}

运行结果:



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值