• 指针函数 (C语言)


    指针函数

     

    内存的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);

     

    The one who wants to wear a crown must bear the weight!
  • 相关阅读:
    SQL Server 2008中的hierarchyid
    SQL判断空值、nvl处理与JOIN的使用
    Transact-SQL语法速查手册
    MySQL连接字符串
    如何让spark sql写mysql的时候支持update操作
    基于calcite做傻瓜式的sql优化(三)
    基于calcite做傻瓜式的sql优化(二)
    基于calcite做傻瓜式的sql优化(一)
    spark升级:从1.6升级到2.4.6的记录
    彻底解决,sparkSQL读取csv中Map字段类型的问题
  • 原文地址:https://www.cnblogs.com/OrangesChen/p/4836724.html
Copyright © 2020-2023  润新知