原文网址: http://www.cnblogs.com/cxbblog/p/3841226.html

一:block基础知识


block基础知识

基本概念:block是用来保存一段代码的;^:是block得标志  好比*:是指针的标志

  特点:1:保存一段代码;

     2:可以有参数和返回值;

     3:可以作为函数的参数传递;

  与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用;

二:普通数据类型、指向函数的指针、block的定义的类比


1:基本数据类型:

  例如:int a = 10;

  格式:数据类型  变量名 = 值;

2:指向函数的指针:可以仿照上边基本数据类型的定义

  例如:void (*p)() = function;    (funciton是某个定义好的函数)

  格式:函数类型  *指针变量名 = 函数名;

     说明:由于p指针是指向函数的,所以(*p)()中的红色小括号必须有,因为函数本身是要参数的,即使没有参数也要写();

  如果p指向的函数有参数:int (*pp)(int, int) = sum;

  调用指向函数的指针:

     无参:p();

     有参:int sum = pp(2,3);

3:block的定义和使用,和指向函数的指针格式很像

  例如:void (^firstBlock)() = ^(){...代码...};   说明:蓝色的小括号可以不写,有参数的时候必须写

  格式:block类型  ^block名称 = ^{代码段};

  有参数block:int (^multiBlock)(int, int) = ^(int a, int b){

        return a * b;

       };

  调用block:无参:firstBlock()

         有参:int result = multiBlock(2, 3);

  

// 备注:指向指针的函数和block,可以像基本数据类型一样可以分步定义 :
int (^multiBlock)(int, int); multiBlock = ^(int a, int b){
return a * b;
};

示例代码:

 1 // 函数定义
2 int sum(int a, int b)
3 {
4 NSLog(@"a+b=%d", a + b);
5 return 2;
6 }
7
8 void logSome()
9 {
10 NSLog(@"我是void型的输出函数");
11 }
12
13 int main()
14 {
15 /*** 1:基本数据类型的定义 ***/
16 int a = 10;
17 // 1.1先定义 后赋值
18 int b;
19 b = 20;
20
21 /*** 2:指向了函数的指针 ***/
22
23 // 2.1:指向有参数的sum(int a, int b)函数
24 int (*p)(int, int) = sum;
25 // 2.2:指向无参数的函数logSome()函数
26 void (*logP)() = logSome;
27
28 // 调用指向函数的指针函数
29 p(2, 3);
30 logP();
31
32 /*** 3:block定义和使用 ***/
33
34 // 3.1:没有参数的block定义
35 void (^firstBlock)() = ^{
36
37 NSLog(@"注意:(^multiBlock)(),这里的小括号必须写,不管有没有参数");
38
39 NSLog(@"而后边的\" ^(){ \"的小括号可以不写");
40 };
41
42 // block的调用
43 firstBlock();
44
45 // 3.2 带参数和有返回值的block
46 int (^multiBlock)(int, int) = ^(int a, int b){
47 return a * b;
48 };
49
50 // 调用block
51 int result = multiBlock(2, 3);
52 NSLog(@"%d", result);
53
54 }

三:利用typedef 定义的block类型


利用typedef可以将繁琐的block定义简单化

  例如:typedef void (^Myblock)(); 然后可以用Myblock类型 创建一个block,创建的格式像类创建对象

// 利用typedef定义block类型
typedef void (^Myblock)(); int main()
{
// 利用自定义的block类型创建一个block
Myblock myblock = ^{
NSLog(@"");
}; }

四:block和指向函数的指针作为函数参数


1:示例代码:

// block作为函数的参数
void test4(void(^mb)())
{
mb(); // 这里要手动调用参数block
} int main()
{ // 调用函数 同时给参数mb赋值一段代码
test4(^{
NSLog(@"block输出");
}); }

2:利用typedef可以将繁琐的block简单后,这个block就成为了一种类型,可以像类一样创建对象,指向函数的指针同样可以

// 利用typedef定义定义指向函数的指针
typedef void (*Tp)();
// 利用typedef定义block
typedef void (^Myblock)(); void logSome()
{
NSLog(@"我是void型的输出函数");
} // 指向函数的指针作为参数
void test1(Tp p)
{
p();
} // block作为函数的参数
void test2(Myblock mb)
{
mb();
} int main()
{
// 指向函数的指针定义
Tp myP = logSome;
test3(myP); // 定义block
Myblock mb = ^{
NSLog(@"block输出");
};
test4(mb);
}
 

指向函数的指针和block的更多相关文章

  1. iOS指向函数的指针和block

      一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作 ...

  2. 指向函数的指针与iOS-Block相关知识

    指向函数的指针与iOS-Block相关知识 一. 函数指针的定义和调用: 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/ ...

  3. C语言中 指向函数的指针 简介

    引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* ...

  4. 12-返回指针的函数&&指向函数的指针

    前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针   一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...

  5. 【C语言】14-返回指针的函数与指向函数的指针

    前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如 ...

  6. 指向函数的指针数组(C++)

    我们能够创建一个指向函数的指针数组.为了选择一个函数,只需要使用数组的下标,然后间接引用这个指针.这种方式支持表格式驱动码的概念:可以根据状态变量去选择被执行函数,而不用条件语句或case语句.这种设 ...

  7. 【学习笔记】【C语言】指向函数的指针

    每个函数都有自己的内存地址,指针保存了函数的地址后就能指向函数了. #include <stdio.h> double haha(double d, char *s, int a) { } ...

  8. C++学习笔记:指向函数的指针

    #include <stdio.h> int sum(int a, int b) { return a+b; } int minus(int a, int b) { return a-b; ...

  9. 指向函数的指针 分类: C/C++ 2015-07-13 11:03 14人阅读 评论(0) 收藏

    原文网址:http://www.cnblogs.com/zxl2431/archive/2011/03/25/1995285.html 讲的很清楚,备份记录. (一) 用函数指针变量调用函数 可以用指 ...

随机推荐

  1. 开源G711(PCMA、PCMU)/G726转AAC项目EasyAACEncoder

    EasyDarwin开源社区整理了一份G711(PCMA.PCMU)/G726转AAC的转码库,支持Windows/Linux跨平台使用,将安防标准的G711转成移动互联网常用的AAC格式,希望能给大 ...

  2. Grid++Report设置显示固定行数

    一.要实现的功能打印的报表显示固定的行数,并且设置字段的文字可以自动换行二.设置步骤1.鼠标左键单击“明细网格”栏,在右侧属性窗口中设置“追加空白行”属性值为:是:“追加空白行在后”属性值为:是.2. ...

  3. svn下载

    首先介绍的是SVN安装包的下载,分别包括服务器版和客户端版 下载地址:http://subversion.apache.org/packages.html 打开后,点击Windows 分别下载客户端( ...

  4. 使用Scapy回放报文pcap

    一.准备环境: Ubuntu + python2.7 sudo apt-get install python-scapy   二.准备报文: 先抓取一些报文,本实验使用的是DHCP的报文. 文件-导出 ...

  5. Cocos2d-x如何添加新场景及切换新场景(包括场景特效)

    做了一天多的工作终于把此功能搞定了,实际上添加新场景花费不了多少时间,时间主要花在切换到另一个场景的实现上,主要原因是编译时出现了一个错误,百思不得其解,后来经过查资料不断摸索才知道自己问题的所在,改 ...

  6. ubuntu12.04出现ERROR: Removing 'hello': Device or resource busy和insmod: error inserting 'hello.ko': -1 Device or resource busy解决方案

    一:insmod时候错误: 1:错误信息insmod: error inserting 'hello.ko': -1 Device or resource busy 2:原因:你的代码里面的设备号和系 ...

  7. Linux下Redis C++操作的封装

    安装和启动Redis服务...略!很粗糙的版本,待改进... Redis Client C++示例代码...略! /** * Time: 14-3-10 * File: RedisCache.h * ...

  8. Redis相关的内核参数解释与设置

    参数 somaxconn /proc/sys/net/core/somaxconn 对于TCP连接,Client和Server连接需要三次握手来建立连接,Server端监听状态会由LISTEN切换为E ...

  9. observer远程监控服务器

    因为需要监控服务器的状况,所以要使用工具observer.但是observer是采用wxWidget开发的,远程机器没有此环境.于是在windows机器上装了虚拟机ubuntu,又折腾erlang和w ...

  10. C++之引用&的详解

    C++中的引用: 引用引入了对象的一个同义词.定义引用的表示方法与定义指针相似,只是用&代替了*.引用(reference)是c++对c语言的重要扩充.引用就是某一变量(目标)的一个别名,对引 ...