一.函数指针定义
函数地址:函数名和数组名一样是地址.
int maxValue(int a, int b) { return a > b ? a : b; } //maxValue是函数名,即是函数地址
函数指针定义
int maxValue(int a, int b) int (*p)(int ,int ) = NULL; //函数指针定义,p是变量,其它是类型
函数指针使用
p = maxValue;//赋值函数名 int m = p(3, 5);//指针可以当函数用
二.回调函数
函数指针做参数
int getValue(int a, int b, int (*p)(int , int)); //getValue是函数名,函数指针做getValue函数的参数
函数调用
int value = getValue(3, 5, maxValue) //getValue执行过程中在调用(回调) maxValue
三.动态排序
排序
void sortArray(int * arr, int count){ for(int i = 0; i < count - 1; i ++){ for(int j = 0;j < count - i - 1; j ++){ if(条件) { 交换; } } } //注意:决定排序方式的重要语句封装成函数后在此回调
int 数组动态排序
typedef BOOL (*PFUN) (int , int); //为函数指针类型起别名为PFUN void sortArray(int *arr, int count, PFUN p); //动态排序函数声明
四.函数返回值是函数指针
返回值为函数指针
PFUN getFunctionByName(char * name); //通过功能名称查找对应的函数
数据结构
typedef struct nameFunctionPair { char name[30]; PFUN function; }NameFunctionPair;
查找对应函数
PFUN fun = NULL; fun = getFunctionByName("min");
调用返回的函数
int value = fun(3, 5); //使用返回的函数指针调用函数,完成动态调用
五.练习代码
#include<stdio.h> void printfArray(int *arr, int count) { for (int i = 0; i < count; i ++) { printf("%2d ", arr[i]); } printf("\n"); } // 1.(***)随机生成一个10个元素的数组,找到3的倍数,并将其值修改成0.(注意:修改数值使用回掉函数处理) void changeValue(int *value) { if (0 == *value % 3) { *value = 0; } } void getValue(int *arr, int count, void (*p)(int *)) { for (int i = 0; i < count; i ++) { p(arr + i); } } // 2. (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, // 如果B的元素小于A的元素进行数值交换:(使用回调函数实现) void changeV(int *number1, int *number2) { if (*number1 < *number2) { int temp = *number1; *number1 = *number2; *number2 = temp; } } void changeArrayElementValue(int *arr1, int *arr2, int count, void (*p)(int *, int *)) { for (int i = 0; i < count; i ++) { p(arr1 + i, arr2 + i); } } int main(int argc, const char * argv[]) { //题1 int arr[10] = {0}; for (int i = 0; i < 10; i ++) { arr[i] = arc4random() % 20 + 1; } printfArray(arr, 10); getValue(arr, 10, changeValue); printfArray(arr, 10); //题2 int myarr1[10] = {0}; int myarr2[10] = {0}; for (int i = 0; i < 10; i ++) { myarr1[i] = arc4random() % 90 + 1; myarr2[i] = arc4random() % 90 + 1; } printf("\n"); printfArray(myarr1, 10); printfArray(myarr2, 10); printf("\n"); changeArrayElementValue(myarr1, myarr2, 10, changeV); printfArray(myarr1, 10); printfArray(myarr2, 10); return 0; }