您的位置:首页 > 移动开发 > Objective-C

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 (*)()
函数原型创建指针变量p类型
void f1()void (*p)()  //打函数名替换成(*p)void (*)()//把函数名替换成(*)
void f2()void (*p)()void (*)()
指向函数f3与函数f4的指针类型是相同的, 都是 int
(*)(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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息