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);