【问题标题】:How to define a variable that is a function pointer that can assign other functions in c?如何定义一个变量,它是一个可以在c中分配其他函数的函数指针?
【发布时间】:2016-04-14 05:08:18
【问题描述】:

因此,如果我被赋予以下 2 个功能:

void printhex(int x, char y, char z)
{
    printf("%x%x%x,x,y,z);
}
void printdecimal( int x, char y ,char z)
{
    printf("%i%i%i,x,y,z);
}

我将如何定义一个变量,即函数指针,它可以分配给两个给定函数中的任何一个?

在主函数中,当程序执行时,我将如何确定是否在程序名称之后输入了任何命令行参数。如果输入了任何内容,我如何能够将函数指针分配给函数 printhex,否则将函数分配给 printdecimal?

【问题讨论】:

标签: c


【解决方案1】:

您可以类似地声明一个变量:

void (*printSomething)(int, char, char);

您可以将其分配给这些功能之一:

printSomething = &printhex;

printSomething = &printdecimal;

& 是完全可选的,所以你也可以只写printSomething = printhex;

你也没有问,但你可以通过指针调用函数(例如):

(*printSomething)(1, 2, 3);

* 也是可选的,所以你可以写:

printSomething(1, 2, 3);

如果您还需要有关命令行参数的帮助,那应该是一个单独的问题。

【讨论】:

    【解决方案2】:

    A1) 函数指针如下所示:

    void (*myFuncPtr)(int, char, char);
    

    然后像这样为它分配一个函数:

    myFuncPtr = &printhex;
    

    然后这样称呼它:

    (*myFuncPtr )(1, 'a', 'b');
    

    A2) main()argc 变量将判断是否输入了除程序名称本身之外的任何命令行参数。如果是argc > 1,那么在调用程序时传递了argc - 1其他字符串。这是因为argc 也将程序名称计为参数之一。所以这样的事情应该适合你:

    if (1 < argc)
    {
        myFuncPtr = &printhex;
    }
    else
    {
        myFuncPtr = &printdecimal;
    }
    

    【讨论】:

      【解决方案3】:

      使用类型定义

      void printhex(int x, char y, char z) {
            printf("%x%x%x",x,y,z);
      }
      
      void printdecimal( int x, char y ,char z) {
            printf("%i%i%i",x,y,z);
      }     
      
      typedef void (*printer)(int x, char y ,char z);
      
      printer hex = &printhex;
      printer dec = &printdecimal;
      

      【讨论】:

        【解决方案4】:

        如果我理解正确的话,应该很简单:

        void (* ptr)(int, char, char);
        ptr = printhex;
        
        (*ptr)(a, b, c); //this will call the function
        

        【讨论】:

          【解决方案5】:

          这样的变量会被声明为

          void (*fptr)(int, char, char);
          

          然后赋值:

          fptr = printhex;
          

          用于调用函数:

          fptr(13, 'a', 'b');
          

          或者您可以为函数类型声明一个新名称:

          typedef void (*PrintFuncPtr)(int, char, char);
          

          然后将其用于变量声明:

          PrintFuncPtr  fptr;
          

          【讨论】:

            【解决方案6】:

            要定义函数指针,您可以使用以下语法:

            return-type (*pointer name)(parameters);

            在这种情况下,您将使用: void (*fp)(int, char, char); 用于名为 fp 的函数指针,适用于您定义的两个函数。

            分配函数指针可以像任何其他指针一样完成,除了您使用函数的名称。例如,fp = printhex; 会按照它所说的那样做:将printhex 的地址分配给指针fp。您不需要对printhex 使用&amp; 运算符,因为标识符已隐式转换为指向函数的指针。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-18
              • 1970-01-01
              • 1970-01-01
              • 2021-01-27
              相关资源
              最近更新 更多