指针函数 (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!
原文地址:https://www.cnblogs.com/OrangesChen/p/4836724.html