指针函数

内存的5大分区(地址由高到低)

    1.栈区: 局部变量

    int a = 10;

    printf("%p\n", &a);

    2.堆区

    int *p = alloca(4);

    printf("%p\n", p);

    3.静态全局区

    staticint b = 10;

    printf("%p\n", &b);

    4.常量区

    char *str = "iPhone";

    printf("%p\n", str);    

    5.代码区

    printf("%p\n", main);

    函数: 具有特定功能的代码段 

    新建一对文件Function.h Function.m, 写一个printHello的函数

    Function.h:

   void hello(); 

   Function.m

  void hello(){ printf("hello!"); } 

   main.m

   hello(); 

    函数指针: 函数在内存中的地址编号

    如何找到函数指针?

    函数的名字就是函数的首地址(函数指针)

    printf("%p\n", hello); 

    如何存一个函数指针?

    定义一个函数指针变量

    变量: 数据类型变量名赋初值 

    如何找到函数指针变量的数据类型

    1.函数声明或定义的部分

    2.把函数名换成(*), 并把参数()后面的部分去掉

    3.如果有参数, 参数的数据类型必须保留, 参数名可以删除或保留(建议删除)

    void (*q)() = NULL; 

    : 函数指针变量名, 要写在*后面

    定义一个函数指针变量, 存函数首地址

     q = hello; printf("%p\n", q); 

    函数指针变量的作用: 用于调用函数

    q(); 

   定义一个函数, 求两个整数之和

int sum(int a, int b){return a + b;
}
int (*p1)(int, int) = sum;
printf("sum = %d\n", p1(2, 3));

回调函数: 使用函数指针变量调用函数

    函数指针的应用

    1.使用typedef对函数指针类型重命名

typedef void (*Hello)();//注: 新的类型名写在*号后面Hello p3 = hello;p3();typedef int (*Sum)(int, int);Sum p4 = sum;printf("sum = %d\n", p4(2, 4));

    2.同一个函数指针变量可以指向不同的函数

    前提: 函数指针类型必须相同  

    求两个整数的最大值

int  max(int a, int b){return  a > b ? a : b;
}
int (*p5)(int, int) = max;printf("max = %d\n", p5(3, 4));p5 = sum;printf("sum = %d\n", p5(2, 4));typedef int (*Max) (int, int);Max p6 = max;printf("max = %d\n", 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\n", result);

    3.函数指针作为函数的参数

    作用: 函数功能具有多样性, 并且函数具有良好的扩展性 

int computerPro(int num1, int num2, int (*p)(int, int)){return p(num1, num2);
}result = computerPro(3, 2, min);printf("result = %d\n", 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\t %d\t  %d\n", 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);

转载于:https://www.cnblogs.com/OrangesChen/p/4836724.html

指针函数 (C语言)相关推荐

  1. 结构体自定义指针函数c语言,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  2. 结构体自定义指针函数c语言,C语言结构体中的函数指针

    C语言结构体中的函数指针 C语言结构体中的函数指针内容由小编收集整理,希望对您的 学习有所帮助!更多内容请关注应届毕业生考试网! 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准 ...

  3. 结构体自定义指针函数c语言,C语言结构体指针在函数调用中的使用

    接触嵌入式编程已经有一段时间了,平时的编程中会经常遇到结构体,但是就直接拿来用了,没有注意过细节,结果遇到问题就纠结了.趁这个机会,研究了一下C语言的结构体和结构体指针,顺便总结一下! 注:关于结构体 ...

  4. C语言 函数指针和指针函数区别 - C语言零基础入门教程

    目录 一.函数指针和指针函数声明的区别 1.函数指针 2.指针函数 二.函数指针和指针函数调用的区别 1.函数指针的调用 2.指针函数的调用 三.猜你喜欢 零基础 Python 学习路线推荐 : C/ ...

  5. C语言:函数指针与指针函数

    文章目录 C语言:函数指针与指针函数 一.概念 二.创建形式 2.1 普通函数创建形式: 2.2 指针函数创建形式: 2.3 函数指针创建形式: 三.使用例子 3.1 指针函数返回字符串 3.2 函数 ...

  6. C/C++ atol函数- C语言零基础入门教程

    目录 一.ltoa 函数简介 二.int/long/unsigned long 区别 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 三.atol 函数 ...

  7. C/C++ strtol 函数 - C语言零基础入门教程

    目录 一.strtol 函数简介 二.strtol 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strtol 函数简 ...

  8. C/C++ strtod函数 - C语言零基础入门教程

    目录 一.strtod 函数简介 二.strtod 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strtod 函数简 ...

  9. C/C++ ultoa函数 - C语言零基础入门教程

    目录 一.ltoa 函数简介 二.int/long/unsigned long 区别 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 三.ultoa 函 ...

  10. C/C++ ltoa函数 - C语言零基础入门教程

    目录 一.ltoa 函数简介 二.int 和 long 区别 三.ltoa 函数函数实战 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 ...

最新文章

  1. 机器学习与高维信息检索 - Note 5 - (深度)前馈神经网络((Deep) Feedforward Neural Networks)及基于CVXOPT的相关实例
  2. 【AAAI Oral】利用深度增强学习自动解数学题,准确率提升15%
  3. 实验集锦二 路由器基础信息、查看命令及CDP
  4. 解决 Error:No suitable device found: no device found for connection quot;System eth0quot;
  5. python中可以用中文作为变量-Python中用中文变量名、函数名,会影响性能吗?
  6. mysql数据库操作语句大全
  7. mysql的三大特性_【mysql】Innodb三大特性之double write
  8. 【渝粤教育】 国家开放大学2020年春季 2412基础写作 参考试题
  9. 二元一次方程有唯一解的条件_人教版初中数学七年级下册用适当方法解二元一次方程组公开课优质课课件教案视频...
  10. pycharm导入本地py文件时,模块下方出现红色波浪线
  11. 问题七十:计算机图形中的采样(Sampling)
  12. js实现视频时间段拖拽编辑
  13. 沈阳python需求大吗_学习Python之后都能做什么,沈阳Python薪资多少钱
  14. RHCS集群 切换时defunct僵尸进程解决方案
  15. Springboot+Vue+EasyExcel实现web页面的excel读取
  16. 电脑如何录制正在播放的视频 这个方法太简单了
  17. 数字图像处理与应用——图像滤波技术
  18. 智慧地产-售楼中心 3D 沙盘可视化
  19. MySql 报错1548
  20. 使用自然语言处理来检测电子邮件中的垃圾邮件

热门文章

  1. 多重继承有时候确实有必要
  2. LINUX获得毫秒时间戳的代码
  3. 管理感悟:不要告诉主管只有一条路
  4. GDT、LDT、IDTR、TR
  5. android json 解析 arraylist,android – 将ArrayList转换为JSONArray
  6. android电商组件化分配,android电商组件化设计(含源码):MVP+dagger+组件化
  7. php数据库图片读取不全,图片显示不出来,但是数据库里有显示
  8. java创建容器对象的类是什么_spring容器创建bean对象的方式
  9. java判断语句总结,JAVA常用操作语句 项目中的总结六
  10. oracle的汇总模板,Oracle EBS汇总模板建立问题处理