如何使用另一个指针访问函数指针数组的元素,然后依次调用其中一个函数?

时间:2018-07-12 10:56:30

标签: c pointers

假设我声明了一个函数指针数组,如下所示:

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)?

2 个答案:

答案 0 :(得分:2)

typedef用于为其他数据类型创建别名,您无法初始化类型。
因此,这是错误的:

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

相反,您应该这样做:

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

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

现在使用此别名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 = ...

仅仅看一下它,似乎x才是数组,直到您研究ptr typedef。
因此,为了提高可读性,您可以执行以下操作:

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

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

现在要创建类型为4的{​​{1}}个函数指针的数组,您可以执行以下操作:

ptr

以类似方式调用它:

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

答案 1 :(得分:1)

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

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

现在fptr是一个typedef,表示“函数指针接受两个int并返回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)