iOS指向函数的指针和block

  一: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和指向函数的指针作为函数参数



利用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);
}

备注:c语言中的函数和oc中的方法有些不一样,c语言函数的参数要想写block后者指向函数的指针,必须先用typedef吧block或者指向函数的指针定义为一种类型,然后才能在函数的参数中传递;

在oc的方法定义中,可以直接用block来作为参数;

iOS指向函数的指针和block,布布扣,bubuko.com

时间: 2024-08-07 08:27:43

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

指向函数的指针和block

原文网址: http://www.cnblogs.com/cxbblog/p/3841226.html 一:block基础知识 block基础知识 基本概念:block是用来保存一段代码的:^:是block得标志  好比*:是指针的标志 特点:1:保存一段代码: 2:可以有参数和返回值: 3:可以作为函数的参数传递: 与代码块的区别,代码块里的代码会自动执行,block中代码要手动调用: 二:普通数据类型.指向函数的指针.block的定义的类比 1:基本数据类型: 例如:int a = 10;

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

本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 回到顶部 前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如指针数组.指向数组的指针.指向指针的指针,呵呵,看到这些名字是否

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

前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如指针数组.指向数组的指针.指向指针的指针,呵呵,看到这些名字是否都觉得头大了,不过我就暂时不在博客中讲解这些内容了,我只讲述在iOS开发中指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针 回到顶部 一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯

C语言 14-返回指针的函数与指向函数的指针

本文目录 前言 一.返回指针的函数 二.指向函数的指针 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略. 前言 前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧.指针可以根据地址直接操作内存中的数据,使用得当的话,不仅能使代码量变少,还能优化内存管理.提升程序性能.关于指针的内容还非常多,比如指针数组.指向数组的指针.指向指针的指针,呵呵,看到这些名字是否都觉得头

指针实现两数交换和指向函数的指针

指针就是地址,而指针变量就是存储地址的变量. 1.指针与函数 利用指针解决: C语言中函数的参数采用"单向传递",故第一个程序中改变形参不会改变实参,而在第二个程序中,使用指针变量作为参数,改变指针变量所指向的值,函数调用结束后,变量值被保留下来. 2.指向函数的指针的应用

指向函数的指针

如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间, 这段存储空间的起始地址(又称入口地址)称为这个函数的指针 例如: int (*p)(int,int) 用函数指针变量调用函数 如果想调用一个函数,除了可以通过函数名调用以外,还可以通过指向函数的指针变量来调用函数 怎样定义和使用指向函数的指针变量 类型名 (*指针变量)(函数参数列表)

编程题:指向函数的指针,求两个数中较大的数。

#include<stdio.h> int max(x,y) { int z; if(x>y)  z=x; else  z=y; return z; } void main() { int a,b,c; int (*p)(); p=max; scanf("%d,%d",&a,&b); c=(*p)(a,b); printf("%d,%d,max is %d\n",a,b,c); } 编程题:指向函数的指针,求两个数中较大的数.,布布

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

引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* frump)(); //指向返回类型为char的函数的指针 char (* flump[3])(); //由3个指针组成的数组,每个指针指向返回类型为char的函数 原来自己根本都不知道还有指向指针的函数,难怪自己懵逼了.参考了两篇博客(1."http://blog.csdn.net/hzyong_

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

1 #include <stdio.h> 2 3 int sum(int a, int b) 4 { 5 return a+b; 6 } 7 8 int minus(int a, int b) 9 { 10 return a-b; 11 } 12 13 int x(int a, int b) 14 { 15 return a*b; 16 } //第一个参数为指向函数的指针,返回类型为int,参数是int,int 1 void counting(int (*p)(int, int), int a