指向引用函数的指针数组的指针,如何更改指针值和调用函数?

时间:2019-02-25 07:30:21

标签: c function-pointers

int *(*(*functions_array)[4](); 
int *function() { /*code */ };

我知道使用指向函数int *(*func)();的指针,我可以将函数的指针值分配给func func = &function;,然后使用func();进行调用。

除了增加数组,我最接近这种行为是什么?

2 个答案:

答案 0 :(得分:1)

您可能想要这样:

#include <stdio.h>

int function1(void)
{
  printf("function 1\n");
  return 1;
};

int function2(void)
{
  printf("function 2\n");
  return 2;
};

int(*FunctionPointer)(void);             // a function pointer
int(*ArrayOfFunctionPointers[4])(void);  // an array of 4 function pointers


int main()
{
  FunctionPointer = function1;
  FunctionPointer();                     // will call function1

  FunctionPointer = function2;
  FunctionPointer();                     // will call function2

  ArrayOfFunctionPointers[0] = function1;
  ArrayOfFunctionPointers[1] = function2;

  for (int i = 0; i < 2; i++)
  {
    ArrayOfFunctionPointers[i]();
  }
}

输出:

function 1
function 2
function 1
function 2

答案 1 :(得分:1)

首先,您显示的声明格式错误。考虑到C语言中的声明符语法有多难,这不足为奇。如果您想要一个函数指针数组(我非常怀疑),那么原始拼写是这样的:

int *(*functions_array[4])();

可读性不强,但至少在语法上正确。现在,您可以对其进行索引以获得要使用的函数指针。例如:

functions_array[0] = function; 
functions_array[0](); // Call the function

但是,如果您真的想要一个指向数组的指针(出于我无法理解的原因),则原始声明符是这样的:

int *(*(*functions_array_p)[4])();

现在具有吸引力较小的索引才能匹配:

(*functions_array_p)[0] = function; 
(*functions_array_p)[0](); // Call the function

由于*[]的常规优先级,因此必须加上括号。

但是使它使用和定义起来更容易的方法是引入一些类型别名。首先,对于函数类型:

typedef int* function_type();

现在,数组声明采用了更易读的形式:

function_type* functions_array[4];

星号清晰可见,这是不隐藏指针语义的一般良好习惯。

还有指向数组的指针:

function_type* (*functions_array)[4];

声明符的外观仍然很规则。


1.顺便说一句,C函数声明中的参数列表为空并不表示该函数不带参数。这是一个过时的功能,提供了没有原型的功能。前进的道路是(void)