当前位置:  开发笔记 > 编程语言 > 正文

我如何使用函数指针数组?

如何解决《我如何使用函数指针数组?》经验,为你挑选了4个好方法。

我应该如何在C中使用函数指针数组?

我该如何初始化它们?



1> VonC..:

你有一个很好的例子(函数指针数组),语法详细.

int sum(int a, int b);
int subtract(int a, int b);
int mul(int a, int b);
int div(int a, int b);

int (*p[4]) (int x, int y);

int main(void)
{
  int result;
  int i, j, op;

  p[0] = sum; /* address of sum() */
  p[1] = subtract; /* address of subtract() */
  p[2] = mul; /* address of mul() */
  p[3] = div; /* address of div() */
[...]

要调用其中一个函数指针:

result = (*p[op]) (i, j); // op being the index of one of the four functions


我想补充一下你可以用`(*p [4])(int,int){sum,substract,mul,div}初始化p`
很好的答案 - 你应该扩展它以显示如何调用其中一个函数.

2> Manoj Doubts..:

以上答案可能对您有所帮助,但您可能也想知道如何使用函数指针数组.

void fun1()
{

}

void fun2()
{

}

void fun3()
{

}

void (*func_ptr[3]) = {fun1, fun2, fun3};

main()
{
    int option;


    printf("\nEnter function number you want");
    printf("\nYou should not enter other than 0 , 1, 2"); /* because we have only 3 functions */
    scanf("%d",&option);

    if((option>=0)&&(option<=2))
    { 
        (*func_ptr[option])();
    }

    return 0;
}

您只能将具有相同返回类型和相同参数类型且没有参数的函数的地址分配给单个函数指针数组.

如果所有上述函数具有相同数量的相同类型的参数,您也可以传递如下所示的参数.

  (*func_ptr[option])(argu1);

注意:在数组中,函数指针的编号将从0开始,与一般数组相同.因此,fun1如果option = 0,fun2可以调用上面的示例,如果option = 1 fun3则可以调用,如果option = 2则可以调用.


这是一个很好的答案,但是你应该在(*func_ptr [3])之后添加括号以使其成为有效的代码.

3> Rasmi Ranjan..:

以下是如何使用它:

New_Fun.h

#ifndef NEW_FUN_H_
#define NEW_FUN_H_

#include 

typedef int speed;
speed fun(int x);

enum fp {
    f1, f2, f3, f4, f5
};

void F1();
void F2();
void F3();
void F4();
void F5();
#endif

New_Fun.c

#include "New_Fun.h"

speed fun(int x)
{
    int Vel;
    Vel = x;
    return Vel;
}

void F1()
{
    printf("From F1\n");
}

void F2()
{
    printf("From F2\n");
}

void F3()
{
    printf("From F3\n");
}

void F4()
{
    printf("From F4\n");
}

void F5()
{
    printf("From F5\n");
}

MAIN.C

#include 
#include "New_Fun.h"

int main()
{
    int (*F_P)(int y);
    void (*F_A[5])() = { F1, F2, F3, F4, F5 };    // if it is int the pointer incompatible is bound to happen
    int xyz, i;

    printf("Hello Function Pointer!\n");
    F_P = fun;
    xyz = F_P(5);
    printf("The Value is %d\n", xyz);
    //(*F_A[5]) = { F1, F2, F3, F4, F5 };
    for (i = 0; i < 5; i++)
    {
        F_A[i]();
    }
    printf("\n\n");
    F_A[f1]();
    F_A[f2]();
    F_A[f3]();
    F_A[f4]();
    return 0;
}

我希望这有助于理解 Function Pointer.



4> M.M..:

这个"答案"更像是VonC答案的附录; 只是注意到可以通过typedef简化语法,并且可以使用聚合初始化:

typedef int FUNC(int, int);

FUNC sum, subtract, mul, div;
FUNC *p[4] = { sum, subtract, mul, div };

int main(void)
{
    int result;
    int i = 2, j = 3, op = 2;  // 2: mul

    result = p[op](i, j);   // = 6
}

// maybe even in another file
int sum(int a, int b) { return a+b; }
int subtract(int a, int b) { return a-b; }
int mul(int a, int b) { return a*b; }
int div(int a, int b) { return a/b; }

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有