Objective-C函数指针
2015-11-02 23:08
585 查看
1. 函数指针: 指向函数的指针
2.程序运行过程中,函数都存储在代码块,代码块是内存的一个分类,本质上也是内存,
3.函数代码所占内存的第一个字节指针(地址)就是函数的指针(地址), 即函数的入口。
4.函数名就是函数的指针(地址)
示例:
void f1() {
NSLog(@"f1()");
}
void f2() {
NSLog(@"f2()");
}
int add(int a, int b) { int (*)(int a, int b)
return a+b;
}
int jian(int a, int b) {
return a-b;
}
int main(int argc, const char *
argv[]) {
@autoreleasepool {//打印出各函数指针的值
NSLog(@"%p", f1);//0x100000e30
NSLog(@"%p", f2);//0x100000e50
NSLog(@"%p", add);//0x100000e70
NSLog(@"%p", jian);//0x100000e90
}
return 0;
}
5.函数指针的声明
指向函数f1与函数f2的指针类型是相同的,都是void (*)()
指向函数f3与函数f4的指针类型是相同的, 都是 int
(*)(int, int)
示例
void f1() {
NSLog(@"f1()");
}
void f2() {
NSLog(@"f2()");
}
int add(int a, int b) {
return a+b;
}
int jian(int a, int b) {
return a-b;
}
int main(int argc, const char *
argv[]) {
@autoreleasepool {
void (*p1)() = f1;
p1 = f2;
int (*p2)(int, int) = add;
p2 = jian;
}
return 0;
}
6.通过函数指针调用函数,即使用使用指针变量名替换函数名
示例
void f1() {
NSLog(@"f1()");
}
void f2() {
NSLog(@"f2()");
}
int add(int a, int b) {
return a+b;
}
int jian(int a, int b) {
return a-b;
}
int main(int argc, const char *
argv[]) {
@autoreleasepool {
void (*p1)() = f1;
p1();//f1()
p1 = f2;
p1();//f2()
int (*p2)(int, int) = add;
int x = p2(1,2);
NSLog(@"x=%d",x);//x=3
p2 = jian;
int y = p2(1,2);
NSLog(@"y=%d",y);//y=-1
}
return 0;
}
2.程序运行过程中,函数都存储在代码块,代码块是内存的一个分类,本质上也是内存,
3.函数代码所占内存的第一个字节指针(地址)就是函数的指针(地址), 即函数的入口。
4.函数名就是函数的指针(地址)
示例:
void f1() {
NSLog(@"f1()");
}
void f2() {
NSLog(@"f2()");
}
int add(int a, int b) { int (*)(int a, int b)
return a+b;
}
int jian(int a, int b) {
return a-b;
}
int main(int argc, const char *
argv[]) {
@autoreleasepool {//打印出各函数指针的值
NSLog(@"%p", f1);//0x100000e30
NSLog(@"%p", f2);//0x100000e50
NSLog(@"%p", add);//0x100000e70
NSLog(@"%p", jian);//0x100000e90
}
return 0;
}
5.函数指针的声明
指向函数f1与函数f2的指针类型是相同的,都是void (*)()
函数原型 | 创建指针变量p | 类型 |
void f1() | void (*p)() //打函数名替换成(*p) | void (*)()//把函数名替换成(*) |
void f2() | void (*p)() | void (*)() |
(*)(int, int)
函数原型 | 创建指针变量p | 类型 |
int add(int a, int b) | int (*p)(int, int)//打函数名替换成(*p) | int (*)(int, int) //把函数名替换成(*) |
int jian(int a, int b) | int (*p)(int, int) | int (*)(int, int) |
void f1() {
NSLog(@"f1()");
}
void f2() {
NSLog(@"f2()");
}
int add(int a, int b) {
return a+b;
}
int jian(int a, int b) {
return a-b;
}
int main(int argc, const char *
argv[]) {
@autoreleasepool {
void (*p1)() = f1;
p1 = f2;
int (*p2)(int, int) = add;
p2 = jian;
}
return 0;
}
6.通过函数指针调用函数,即使用使用指针变量名替换函数名
示例
void f1() {
NSLog(@"f1()");
}
void f2() {
NSLog(@"f2()");
}
int add(int a, int b) {
return a+b;
}
int jian(int a, int b) {
return a-b;
}
int main(int argc, const char *
argv[]) {
@autoreleasepool {
void (*p1)() = f1;
p1();//f1()
p1 = f2;
p1();//f2()
int (*p2)(int, int) = add;
int x = p2(1,2);
NSLog(@"x=%d",x);//x=3
p2 = jian;
int y = p2(1,2);
NSLog(@"y=%d",y);//y=-1
}
return 0;
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C++普通函数指针与成员函数指针实例解析
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 检测iOS设备是否越狱的方法
- C++基础入门教程(九):函数指针之回调
- C语言中函数与指针的应用总结
- Objective-C的内省(Introspection)用法小结
- .net平台推送ios消息的实现方法
- 函数指针与指针函数的学习总结
- 探讨Android与iOS,我们将何去何从?
- C++中的函数指针与函数对象的总结
- c++函数指针使用示例分享