IOS 块 和 C 函数指针

函数指针的声明方法为:
函数类型 (标志符 指针变量名) (形参列表);
“函数类型”说明函数的返回类型,
“(标志符指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,
后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

一个代码块可以简单看作是一组可执行的代码。
例如:
^ {
NSLog(@"Hello!... ...");
};
插入符号(^)声明一个代码块的开始,一对大括号{}构成了代码块的体部。你可以认为代码块与一个匿名函数类似。那么,如果是一个匿名的函数,我们该怎么调用这个代码块呢?最常见使用代码块的方式是将其传入方法中供方法回调,就像之前我们经常见到的view animations 。另一种使用代码块的方式是将其赋予代码块变量,然后可使用该变量来直接调用代码块。
以下是如何声明我们的代码块并将它赋予代码块变量sayWord:
void (^sayWord)(void) = ^ {
NSLog(@"Hello!... ...");
};
使用的时候该怎么办呢?
我们直接 sayWord(); //有惊喜


代码块变量之前有^符号并被小括号包着,代码块变量有类型定义的。因此,上面的sayWord变量可以应用任何无参,无返回值的代码块。
于是我们可以
void (^sayWord)(void) = ^ {
NSLog(@"Hello!... ...");
NSLog(@"Hello!... ...");
NSLog(@"Hello!... ...");
};
我们直接 sayWord(); //有惊喜

有参数怎么办呢??
void (^sayWord)(NSString*,NSString*) = ^ (NSString *name,NSString *address){
NSLog(@"name is %@",name);
NSLog(@"address is %@",address);
};
OK ,我们直接 sayWord(“name”,“address”);//同样有惊喜
有参数,有返回值呢??
说一下 这个返回值你最好不要加() 比如 (int) (^add)(int,int) = ^ (int i,int j){
return i+j;
};
应该这样
int (^add)(int,int) = ^ (int i,int j){
return i+j;
};
其实意思就是前半句声明了一个名字为add的代码块,有2个int类型的参数,并返回一个int类型的值;后面的半句就是一个块的定义,然后赋值给add。
OK ,我们直接 NSLog(@“result is %d”,add(3,4));//同样也有惊喜
///
注意了:
如果想在block中修改局部变量,你需要在局部变量前加__block!!
__block int m=10;
int (^add)(int,int) = ^ (int i,int j){
return i+j+m;
};

不知道你们明白没有?



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值