• 22深入理解C指针之---通过指针传递函数


     一、通过指针传递函数与通过指针传递数据的本质是一样的,区别就是此时的数据是函数指针(函数的开始的地址)

        1、定义:通过函数指针将函数传入函数;通过函数返回函数指针实现函数返回函数的目标

        2、特征:

          1)、通过函数指针的介入,使函数调用变得更加灵活,实现功能的封装性

          2)、使真正的函数下沉一层,有利于函数功能的抽象

          3)、是函数的交互变得更加自然与方便

        3、函数指针:

          1)、定义:与普通函数的定义基本类似,包括函数类型、函数名称和函数参数;形如 int  (*guoCal)(int, int);

          2)、特征:唯一的区别就是在函数名称前加上*,并使用()将*和函数名称包括起来;

          3)、说明:上述定义的是返回类型为int ,函数参数为两个int类型的函数的指针;


          4)、应用:若存在上述定义,存在函数int add(int, int), int sub(int, int), 则可以有guoCal = add; guoCal = sub等语句

      代码如下:

            1)、通过函数指针使函数返回函数:

     1 #include <stdio.h>
     2
     3 int add(int var1, int var2){
     4     return var1 + var2;
     5 }
     6
     7 int sub(int var1, int var2){
     8     return var1 - var2;
     9 }
    10
    11 int mul(int var1, int var2){
    12     return var1 * var2;
    13 }
    14
    15 int div(int var1, int var2){
    16     return var1 / var2;
    17 }
    18
    19 int mod(int var1, int var2){
    20     return var1 % var2;
    21 }
    22
    23 void inputVar(int *var1, int *var2){
    24     printf("Please input var1: ");
    25     scanf("%d", var1);
    26
    27     printf("Please input var2: ");
    28     scanf("%d", var2);
    29
    30     return;
    31 }
    32
    33 typedef int (*ptrCal)(int, int);
    34
    35 ptrCal resultCal(char *ch){
    36     ptrCal cal1;
    37     printf("Please input ch: ");
    38     scanf("%c", ch);
    39
    40     switch(*ch){
    41         case '+':
    42             cal1 = add;
    43             break;
    44
    45         case '-':
    46             cal1 = sub;
    47             break;
    48
    49         case '*':
    50             cal1 = mul;
    51             break;
    52
    53         case '/':
    54             cal1 = div;
    55             break;
    56
    57         case '%':
    58             cal1 = mod;
    59             break;
    60
    61         default:
    62             printf("you can select:+ - * / %!
    ");
    63     }
    64
    65     return cal1;
    66 }
    67
    68 int main(int argc, char **argv)
    69 {
    70     ptrCal cal2;
    71     int var1;
    72     int var2;
    73     char ch;
    74     inputVar(&var1, &var2);
    75     getchar();
    76     cal2 = resultCal(&ch);
    77     printf("The %d %c %d = %d
    ", var1, ch, var2, cal2(var1, var2));
    78
    79     return 0;
    80 }


          2)、通过将函数指针作为函数的参数:

     1 #include <stdio.h>
     2
     3 int add(int var1, int var2){
     4     return var1 + var2;
     5 }
     6
     7 int sub(int var1, int var2){
     8     return var1 - var2;
     9 }
    10
    11 int mul(int var1, int var2){
    12     return var1 * var2;
    13 }
    14
    15 int div(int var1, int var2){
    16     return var1 / var2;
    17 }
    18
    19 int mod(int var1, int var2){
    20     return var1 % var2;
    21 }
    22
    23 void inputVar(int *var1, int *var2){
    24     printf("Please input var1: ");
    25     scanf("%d", var1);
    26
    27     printf("Please input var2: ");
    28     scanf("%d", var2);
    29
    30     return;
    31 }
    32
    33 typedef int (*ptrCal)(int, int);
    34
    35 int resultCal(ptrCal cal, int var1, int var2){
    36     return cal(var1, var2);
    37 }
    38
    39 int main(int argc, char **argv)
    40 {
    41     int var1;
    42     int var2;
    43     inputVar(&var1, &var2);
    44     printf("The %d + %d = %d
    ", var1, var2, resultCal(add, var1, var2));
    45     printf("The %d - %d = %d
    ", var1, var2, resultCal(sub, var1, var2));
    46     printf("The %d * %d = %d
    ", var1, var2, resultCal(mul, var1, var2));
    47     printf("The %d / %d = %d
    ", var1, var2, resultCal(div, var1, var2));
    48     printf("The %d %% %d = %d
    ", var1, var2, resultCal(mod, var1, var2));
    49
    50     return 0;
    51 }

        可以看到,借助函数指针令函数调用更加灵活。

  • 相关阅读:
    叉积与点积
    Vector3 *2 ,ToString()自动四舍五入
    "无法删除数据库,因为该数据库当前正在使用"问题解决
    感谢信
    实变函数一窥
    北京大学2015年数学分析考研试题
    象棋是门残忍的艺术---续篇
    象棋是门残忍的艺术
    赣南师范学院教师高级专业技术资格评审委员会评审通过人员公示名单
    [再寄小读者之数学篇](2014-12-24 乘积型不等式)
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6960838.html
Copyright © 2020-2023  润新知