• 指针函数、函数指针、指针函数数组


    一、指针函数

    概念:本质上是函数,函数的返回值是地址

    1. 1、定义格式:
    2. 存储类型 数据类型 *函数名(形参)
    3. {
    4. 函数体;
    5. return 地址;
    6. }
    7. 局部变量 -->  栈区、自动开辟自动释放
    8.             生命周期:函数调用结束空间释放
    9. 作用域:函数体内,定义未初始化值为随机值。
    10. 全局变量 -->  静态区(.bss-定义值0 .data-定义的同时初始化),
    11.             生命周期:程序结束空间释放,
    12. 作用域:整个文件,定义未初始化值为0
    13. 堆区 ----->程序员使用时开辟,用完需要手动释放
    14. malloc:手动开辟堆区空间函数
    15. #include <stdlib.h>
    16. void *malloc(size_t size);
    17. 功能:在堆区开辟空间
    18. 参数:size:开辟空间的字节大小
    19. 返回值:成功 -->开辟空间的首地址
    20.    失败 -->NULL
    21. free:手动释放堆区空间
    22. void free(void *ptr) //手动释放堆区空间
    23. 功能:释放堆区空间
    24. 参数:ptr:要释放空间的首地址
    25. 返回值:无

    • 函数指针

    本质:本质上是指针是指向一个函数的指针。

    函数名就是函数的首地址。

    1. 1、定义格式
    2. 存储类型 数据类型 (*函数指针变量名)(形参列表)
    3. int add(int a,int b)
    4. {
    5. return a+b;
    6. }
    7. int sub(int c,int d)
    8. {
    9. return a-b;
    10. }
    11. 定义指针指向这个函数:
    12. int (*p)(int,int);
    13. p = add;// 相当于用 p代替add访问函数,指针调用函数
    14. 2、通过函数指针调用函数
    15. 函数指针变量名(参数)-->指针代替函数名去调用函数
    16. (*函数指针变量名)(实参)-->不常用

    用法:

    当一个函数指针指向一个函数,就可以通过这个指针来调用该函数

    1. int add(int a, int b)
    2. {
    3. return a + b;
    4. }
    5. int sub(int c, int d)
    6. {
    7. return c - d;
    8. }
    9. int main(int argc, char const *argv[])
    10. {
    11. int (*p)(int, int) = add;
    12. printf("%d\n", p(1, 2));
    13. return 0;
    14. }

    函数指针可以将函数作为参数传递给其他的函数调用

    举例:

    1. 1、char *fun(int a,short *b);
    2. 定义一个函数指针来指向这个函数:
    3. char *(*p1)(int,short *)=fun;
    4. 2、void fun1(char *sp,int **st,int n)
    5. 定义一个函数指针来指向这个函数:
    6. void (*p2)(char *,int **,int)=fun1;
    7. 3、void *fun2(int (*sp)[3],int m);
    8. 定义一个函数指针来指向这个函数:
    9. void *(*p3)(int (*)[3],int)=fun2;

    • 函数指针数组

    本质是数组,元素是同类型的函数指针

    1. 定义格式:

    存储类型 数据类型  (*函数指针数组名[元素个数])(形参列表)

    1. #include 
    2. int add(int a, int b)
    3. {
    4. return a + b;
    5. }
    6. int sub(int a, int b)
    7. {
    8. return a - b;
    9. }
    10. int sul(int a, int b)
    11. {
    12. return a * b;
    13. }
    14. int less(int a, int b)
    15. {
    16. return a % b;
    17. }
    18. int main(int argc, char const *argv[])
    19. {
    20. int (*sp[4])(int, int) = {add, subsulless}; // 函数指针数组的声明
    21. int ret = sp[1](1, 3); // 函数的调用
    22. printf("%d\n", ret);
    23. return 0;
    24. }

  • 相关阅读:
    二叉树的重建问题
    redis复习总结
    【每日一题Day360】LC1465切割后面积最大的蛋糕 | 贪心
    基于nodejs的电影交流网站-计算机毕业设计
    Python 疫情数据可视化(爬虫+数据可视化)(Jupyter环境)
    GPU cuda cuDNN pytorch理解
    linux篇【9】:进程间通信——<前序>
    Vite为啥如此之快
    springboot 线程池参数解释
    (十一)admin-boot项目之整合redis
  • 原文地址:https://blog.csdn.net/m0_74937538/article/details/132622780