C语言学习—函数指针

一.函数指针定义

    函数地址:函数名和数组名一样是地址. 

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






你可能感兴趣的:(函数指针定义,函数回调,函数返回值是函数指针,动态排序)