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