指针函数
内存的5大分区(地址由高到低)
1.栈区: 局部变量
int a = 10;
printf("%p ", &a);
2.堆区
int *p = alloca(4);
printf("%p ", p);
3.静态全局区
staticint b = 10;
printf("%p ", &b);
4.常量区
char *str = "iPhone";
printf("%p ", str);
5.代码区
printf("%p ", main);
函数: 具有特定功能的代码段
新建一对文件Function.h 和 Function.m, 写一个printHello的函数
Function.h:
void hello();
Function.m
void hello(){ printf("hello!"); }
main.m
hello();
函数指针: 函数在内存中的地址编号
如何找到函数指针?
函数的名字就是函数的首地址(函数指针)
printf("%p ", hello);
如何存一个函数指针?
定义一个函数指针变量
变量: 数据类型变量名赋初值
如何找到函数指针变量的数据类型
1.函数声明或定义的部分
2.把函数名换成(*), 并把参数()后面的部分去掉
3.如果有参数, 参数的数据类型必须保留, 参数名可以删除或保留(建议删除)
void (*q)() = NULL;
注: 函数指针变量名, 要写在*后面
定义一个函数指针变量, 存函数首地址
q = hello; printf("%p ", q);
函数指针变量的作用: 用于调用函数
q();
定义一个函数, 求两个整数之和
int sum(int a, int b){ return a + b; } int (*p1)(int, int) = sum; printf("sum = %d ", p1(2, 3));
回调函数: 使用函数指针变量调用函数
函数指针的应用
1.使用typedef对函数指针类型重命名
typedef void (*Hello)(); //注: 新的类型名写在*号后面 Hello p3 = hello; p3(); typedef int (*Sum)(int, int); Sum p4 = sum; printf("sum = %d ", p4(2, 4));
2.同一个函数指针变量可以指向不同的函数
前提: 函数指针类型必须相同
求两个整数的最大值
int max(int a, int b){ return a > b ? a : b; } int (*p5)(int, int) = max; printf("max = %d ", p5(3, 4)); p5 = sum; printf("sum = %d ", p5(2, 4)); typedef int (*Max) (int, int); Max p6 = max; printf("max = %d ", p6(7,3));
输入两个整数, 实现四则运算
int sum(int a, int b){ return a + b; } int minus(int a, int b){ return a - b; } int mul(int a, int b){ return a * b; } int divide(int a, int b){ return a / b; } int computer(int num1, int num2, int flag){ int (*p)(int , int) = NULL; switch (flag) { case 1: p = sum; break; case 2: p = minus; break; case 3: p = mul; break; case 4: p = divide; break; default: break; } return p(num1, num2); }
int result = computer(2, 3, 3);
printf("result = %d ", result);
3.函数指针作为函数的参数
作用: 函数功能具有多样性, 并且函数具有良好的扩展性
int computerPro(int num1, int num2, int (*p)(int, int)){ return p(num1, num2); } result = computerPro(3, 2, min); printf("result = %d ", result);
冒泡排序
按照年龄从小到大排序
Function.h
struct student{ char name[20]; int num; int age; }; typedef struct student Student; void sortArray(Student array[], int count, BOOL (*p)(Student, Student)); BOOL sortByAge (Student stu1, Student stu2); BOOL sortByNum (Student stu1, Student stu2); BOOL sortByName(Student stu1, Student stu2);
Function.m
void sortArray(Student array[], int count, BOOL (*p)(Student, Student)){ for (int i = 0; i < count - 1; i++) { for (int j = 0; j < count - 1 - i; j++) { if (p(array[j], array[j + 1])) { Student temp = array[j];//交换结构体变量 array[j] = array[j + 1]; array[j + 1] = temp; } } } for (int i = 0; i < count; i++) { printf("%s %d %d ", array[i].name, array[i].num, array[i].age);//打印结构体变量 } } //BOOL(*)(Student, Student) BOOL sortByAge (Student stu1, Student stu2){ return stu1.age > stu2.age;// BOOL result = stu1.age > stu2.age;return result; } BOOL sortByNum (Student stu1, Student stu2){ return stu1.num > stu2.num;//2nd } BOOL sortByName(Student stu1, Student stu2){ return strcmp(stu1.name, stu2.name) > 0; }
main.m
Student stu1 = {"zhangsan", 1314, 18}; Student stu2 = {"jiujing", 520, 38}; Student stu3 = {"laowang", 666, 40}; Student stu4 = {"wangmazi", 999, 20}; Student stu5 = {"huihui", 1234567, 16}; Student array[5] = {stu1, stu2, stu3, stu4, stu5}; //冒泡排序 //按照年龄从小到大排序 sortArray(array, 5, sortByName);