C语言函数指针和Objective-c中的block

C语言中的函数指针:

先来看下普通的变量怎么定义指针,及通过指针调用该变量

        //声明变量
        int i;
        i = 9;
        //直接调用
        printf("i = %d",i);
        //============分割线=================
        //声明一个指针指向该变量
        /*
         声明指针的步骤:
         1,复制该变量的声明  //int i;
         2,给变量名加括号:  //int (i);
         3,改变名字:       //int (p);
         4,名字前面加*      //int (*p);
         5,将该指针指向变量  //p = &i;
         */
        int *p = &i;
        //调用该指针(间接调用该变量)
        /*
         通过指针调用的步骤:
         1,拷贝直接调用的代码 //  i
         2,加括号           //  (i)
         3,改变名字         //  (p)
         4,加*             //  (*p)
         */
        printf("\n*p = %d",*p);
下面我们通过步骤来写一个函数的指针

       //直接调用函数
        printf("add = %d\n",add(3, 9));
        printf("mul = %d",mul(3, 9));
        
        /*
         变量名,函数名等都是标识符!
         标识符的确认方法:
         标识符:由数字,字母,下划线组成
         */
        //声明一个指针指向该函数
        /*
         声明指针的步骤:
         1,复制该函数的声明  //int add(int a, int b);
         2,给函数名加括号:  //int (add)(int a, int b);
         3,改变名字:       //int (pp)(int a, int b);
         4,名字前面加*      //int (*pp)(int a, int b);
         5,将该指针指向函数  //pp = &add;
         */
        int (*pp)(int a, int b) = &add;
        //调用该函数指针(间接调用该函数)
        /*
         通过指针调用的步骤:
         1,拷贝直接调用的代码 //  add(3, 9);
         2,加括号           //  (add)(3, 9);
         3,改变名字         //  (pp)(3, 9);
         4,加*             //  (*pp)(3, 9);
         */
        printf("\nadd = %d\n",(*pp)(3, 9));

Objective-c中的block

void test() {
    NSLog(@"test");
}

//直接调用
    test();

使用block
在程序运行时:先走block的声明,再走赋值,再走调用,最后走实现!
    //声明block
    void (^testBlock)();

    //给block赋值(几种形式)
    //第一种形式
    testBlock = ^ void (){//赋给block的就是一个没有函数名的函数
        NSLog(@"testBlock,1");  //函数的实现
    };

    //调用block
    testBlock();
    
    //再次赋值,第二种形式
    testBlock = ^ () {//可以省略任何类型的返回值
        NSLog(@"testBlock,2");
    };
    testBlock();
    
    //再次赋值,第三种形式
    testBlock = ^ {//无参的情况下,可以把参数列表也省略
        NSLog(@"testBlock,3");
    };
    testBlock();

block的实际运用1:

//c函数
int addNumbers(int a, int b, int c) {
    return a+b+c;
}

//同样功能的block
    int (^addNumbersBlock)(int a, int b, int c) = ^(int a, int b,int c) {
        return a+b+c;
    };
    NSLog(@"addNumbersBlock = %d",addNumbersBlock(2, 7, 0));

block的实际运用2:将block作为一个参数传入方法中

//定义方法
- (int)addNumbersWithBlock:(int (^)(int num1, int num2, int num3))block withNum1:(int)num1 withNum2:(int)num2 withNum3:(int)num3 {
    return block(num1, num2, num3);
}
   
   //第一种调用:
   //调用方法,先声明一个block,直接传入
    int (^addBlock)(int num1, int num2, int num3) = ^(int num1, int num2, int num3) {
        return num1+num2+num3;
    };

    result = [self addNumbersWithBlock:addBlock withNum1:1 withNum2:2 withNum3:3];
    NSLog(@"result = %d",result);

    //第二种调用:
    //调用方法时 定义一个block
    int result;
    result = [self addNumbersWithBlock:^int(int num1, int num2, int num3) {
        return num1+num2+num3;
    } withNum1:1 withNum2:2 withNum3:3];
    NSLog(@"result = %d",result);






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值