【问题标题】:How to access elements of an array of function pointers using another pointer and in turn call one of the functions?如何使用另一个指针访问函数指针数组的元素,然后调用其中一个函数?
【发布时间】:2018-07-12 10:56:29
【问题描述】:

假设我声明一个函数指针数组如下:

typedef void (*ptr[4])( int a, int b)={fn1,fn2,fn3,fn4};

现在我声明,

ptr *ptr_to_fn_arr;

问题是,如何使用指针变量ptr_to_fn_arr调用任何函数(fn1、fn2、fn3、fn4)?

【问题讨论】:

  • 欢迎来到 StackOverflow。 typedef 不应包含赋值。请提供实际上是有效代码的示例。一般来说,请提供您的代码的完整示例
  • 我同意@Gerhardh——为了解决你的问题,你应该将你的 typedef 与你的数组分配分开。然后你可以简单地索引到数组来访问指向你的函数的指针

标签: c pointers


【解决方案1】:

typedef 用于为其他数据类型创建别名,不能初始化类型。
所以,这是错误的:

typedef void (*ptr[4])( int a,  int b)={fn1,fn2,fn3,fn4};
                                      ^^^^^^^^^^^^^^^^^

你应该这样做:

typedef void (*ptr[4])( int a,  int b);

这将为4 函数指针数组创建ptr 作为type,该函数指针以两个int 类型作为参数并且不返回任何值。

现在使用这个别名 ptr 你可以创建它的类型的变量,像这样:

ptr x = {fn1, fn2, fn3, fn4};

这将初始化变量x,它是4 类型为ptr 的函数指针的数组。

你可以这样称呼它:

x[0](1, 2); // this is equivalent to fn1(1, 2)
x[1](1, 2); // this is equivalent to fn2(1, 2)
....
.... and so on.

但是声明

ptr x = ...

仅通过查看,在您查看 ptr 类型定义之前,x 似乎不是一个数组。
因此,为了提高可读性,您可以这样做:

typedef void (*ptr)( int a,  int b);

这将创建ptr 作为函数指针的类型,该函数指针接受两个int 类型作为参数并且不返回任何值。

现在要创建4 类型为ptr 的函数指针数组,您可以这样做:

ptr x[4] = {fn1, fn2, fn3, fn4};

以类似的方式调用它:

x[2](1, 2); // this is equivalent to fn3(1, 2)

【讨论】:

    【解决方案2】:

    如果我们将 typedef 设置为函数指针类型,这样做会更容易:

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

    现在fptr 是“指向函数的指针接受两个整数并返回 void”的类型定义。

    所以声明数组很简单:

    fptr fn_arr[4] = {fn1, fn2, fn3, fn4};
    

    并且声明指针很简单:

    fptr *ptr_to_fn_arr = fn_arr;
    

    但是现在我们如何调用函数呢?

    fn_arr 是一个函数指针数组,所以fn_arr[i] 是一个函数指针。

    ptr_to_fn_arr是指向函数指针的指针,所以*ptr_to_fn_arr是函数指针。 ptr_to_fn_arr[i] 也是如此。 (这里与更“普通”的数组和指针的类比应该很明显。)

    因此,通过 ptr_to_fn_arr 调用的严格解释方式是

    (*(*ptr_to_fn_arr))(1, 2)
    

    (*ptr_to_fn_arr[i])(3, 4)
    

    但由于您可以对函数指针执行的唯一操作就是调用指向的函数,因此您实际上并不需要显式的*,因此这两种方法也都可以使用:

    (*ptr_to_fn_arr)(1, 2)
    

    ptr_to_fn_arr[i](3, 4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多