假设我声明了一个函数指针数组,如下所示:
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)?
答案 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)