• C语言函数指针和返回指针值的函数


    一、用函数指针变量调用函数

    一个函数,在编译的时候 ,系统会给这个函数分配一个入口地址,这个入口地址就称为函数的指针(地址)。既然有地址,那么我们可以定义一个指针变量指向该函数,然后,我们就可以通过该指针变量调用该函数了。

    每个函数在可执行文件时都会占用一段内存单元,它们有一个起始地址。既然有地址,就可以用一个指针变量指向一个函数,从而通过指针变量来调用它所指向的函数。、

    1. #include
    2. int max(int x,int y) //函数本身会占用一段内存单元
    3. {
    4. if(x>y)
    5. return x;
    6. return y;
    7. }
    8. int main()
    9. {
    10. int c;
    11. //c=max(5,19);
    12. int (*p)(int x,int y); //定义一个函数指针变量;不可以写成 int *p(int x,int y); 这就是函数声明了;
    13. //这里int *就表示这个函数的返回值是指向整型变量的指针。
    14. //*p两侧的括号()不可以省略,有()表示*和p先结合代表一个指针变量,然后再和后边的()结 合表示此指针变量指向函数。
    15. //int (*p)(int x,int y);可以写成 int (*p)(int,int);
    16. p=max; //将函数max的入口地址赋给指针变量p,函数名代表函数的入口地址
    17. //现在p就是指向函数max的指针变量,p和max都指向函数的开头。
    18. //p=&max;这样写也可以,所以 p=max; 和 p=&max; 是等价的。
    19. c=(*p)(5,19); //调用*p就是调用函数max,p指向函数max的入口,等价于c=max(5,19);
    20. //这里的调用只是用*p取代了函数名
    21. //p不能指向函数中间的某条语句,所以*(p+1)不合法
    22. //其实在函数调用的时候,* 可以省略的;所以在这里 c=(*p)(5,19); 和 c=p(5,19); 等价。
    23. printf("c=%d\n",c);
    24. printf("max=%p\n",max);
    25. printf("p=%p\n",p); //发现 p 和 max 的地址相同
    26. }

    总结:

    a) 函数指针变量定义的一般形式:

    数据类型标识符 (*指针变量名) (形参列表)

    其中,“数据类型标识符” 就是指函数的返回值类型,“形参列表” 里可以只有类型说明符(*p)(int,int),多个类型说明符之间用逗号分隔。

    我们可以通过函数指针指向不同的函数 来达到调用不同函数的目的;这个是有实际用途的。

    b) 函数的调用,可以通过函数名,也可以通过函数指针调用。

    c) 对指向函数的指针变量 p ,做一些像 p++,p--,p+n 等运算都不可以,也没有意义。

    二、把指向函数的指针变量作为函数参数

    指向函数的指针变量也可以作为 另一个函数FuncB的参数,从而实现函数地址的传递,也就是FuncB函数中调用该函数指针变量所指向的函数的目的。

    发现:在另一个函数中也可以直接调用另一个函数,但是把另一个函数作为函数参数调用,增加了函数的灵活性。

    1. #include//函数一
    2. int max(int x,int y) //函数本身会占用一段内存单元
    3. { if(x>y) return x; return y;}//函数二用函数一作为函数参数
    4. int wwmax(int x,int y,int (*midfunc)(int x,int y))//形参
    5. int (*midfunc)(int x,int y)就是一个函数指针
    6. { int result =midfunc(x,y); //调用 函数指针 midfunc 所指向的函数
    7. return result;
    8. }
    9. int main()
    10. { int c; c=wwmax(5,19,max);
    11. printf("c=%d\n",c); //结果是19
    12. int (*p)(int,int); //定义一个局部的函数指针变量
    13. p=max; c=wwmax(45,21,p); printf("c=%d\n",c);
    14. //结果是45 return 0;}

    三、返回指针值的函数

    函数中也可以返回指针型数据。也就是地址。

    返回指针值的函数的一般定义形式:

    数据类型 *函数名 (int x,int y);

    int *a(int x,int y);     //a是函数名,()的优先级高于 * ,因此a先和(int x,int y)结合

    1. #include
    2. int sum; //定义一个全局变量,生存周期一直到程序结束,这个变量占用的内存一直存在,能够被我控制,不会被系统回收。
    3. int *add(int x,int y)
    4. {
    5. sum=x+y;
    6. return//隐藏一个致命问题,add函数调用完毕后,sum的内存就会被系统回收。绝不可以把sum的内存地址返回到被调用函数中并加以使用。
    7. }
    8. int main()
    9. {
    10. int *persult;
    11. persult = add(4,5); //执行这个add后,persult指向的内存已经不归你所有,你不应该从中取得值或者给它赋值。
    12. printf("persult=%d\n",*persult);
    13. return 0;
    14. }

  • 相关阅读:
    信号处理琐碎知识点 — OFDM 正交频分复用
    grep扩展正则使用
    Windows调试技巧&工具
    【机器学习】生成对抗网络GAN
    c语言项目-贪吃蛇项目2-游戏的设计与分析
    MATLAB----矩阵处理
    C/C++问题:一个指针的大小是多少?怎么理解指针变量的存在
    【数据结构】—堆排序以及TOP-K问题究极详解(含C语言实现)
    MySQL的varchar存储原理:InnoDB记录存储结构
    SWT/ANR问题-- OTA 升级 从Android P 到 Q 发生 watchdog
  • 原文地址:https://blog.csdn.net/qq_48516121/article/details/126891632