在C中如何声明一个常量函数指针的数组?

我需要声明一个指向数组的函数,如下所示:

extern void function1(void);
extern void function2(void);
...

void (*MESSAGE_HANDLERS[])(void) = {
   function1,
   function2,
   ...
};

但是,我希望数组被声明为常量 – 数组中的数据和数据的指针。不幸的是,我不记得在哪里放置const关键字。

在这种情况下,我假定实际的指针MESSAGE_HANDLERS已经是常量,因为它被声明为一个数组。另一方面,如果声明如图所示,数组中的函数指针不能在运行时更改?

最佳答案
有一种记住如何构建这种类型的技术。首先尝试从他们的名字读取指针,从右到左阅读。

如何在没有帮助的情况下声明该内容?

数组

T t[5];

是一个5 T的数组。要使T成为一个函数类型,你将返回类型写到左边,右边的参数是:

void t[5](void);

将是一个返回void并且不使用参数的5个函数的数组。但函数本身不能填充在数组中!它们不是物体。只有指针才能。

关于什么

void * t[5](void);

这仍然是错误的,因为它只会将返回类型更改为指向void的指针。你必须使用括号:

void (*t[5])(void);

这实际上是有效的。 t是一个返回void并且不使用参数的函数的5个指针数组。

大!一系列指向arras的指针呢?这非常相似。元素类型显示在左侧,尺寸在右侧。同样,需要括号,否则数组将成为整数指针的多维数组:

int (*t[5])[3];

而已!一组5个指向3 int数组的指针。

功能怎么样?

我们刚刚学到的功能也是如此。让我们声明一个函数,使用一个int函数,返回一个指向另一个函数的指针,而不需要参数,并返回void:

void (*f(int))(void);

由于与上述相同的理由,我们再次需要括号。我们现在可以调用它,并将返回的函数再次指向。

f(10)();

返回一个指向函数的指针返回另一个指向函数的指针

那这个呢?

f(10)(true)(3.4);

?换句话说,一个函数如何将一个指针返回一个函数,使用bool返回一个指向double和return void的函数的指针看起来像?答案是你只需要嵌套它们:

void (*(*f(int))(bool))(double);

你可以无休止地这样做。实际上,你也可以返回一个指向数组的指针,就像你可以指向一个函数的指针一样:

int (*(*f(int))(bool))[3];

这是一个函数,使int返回一个指向函数的指针,该函数使用bool返回一个指向3 int数组的指针

它与const有什么关系?

现在以上解释了如何从基本类型构建复杂类型,您可以将const放在现在知道他们所属的位置。只要考虑一下:

T c * c * c ... * c name;

T是我们最后指向的基本类型。 c代表const或者const const。例如

int const * const * name;

将声明名称以使类型指针指向常量int的常量指针。您可以更改名称,但不能更改*名称,这将是类型

int const * const

和**名称,这将是类型

int const

我们把它应用到上面的函数指针:

void (* const t[5])(void);

这实际上会声明数组包含常量指针。所以在创建(和初始化)数组之后,指针是const,因为const出现在星号之后。注意,在这种情况下,我们不能在const之前放const,因为没有指向常量函数的指针。函数根本不能是const,因为这样就没有意义。所以以下是无效的:

void (const * t[5])(void);

结论

声明函数和数组的C和C实际上实际上有点混乱。你必须首先弄清头脑,但是如果你明白了,你可以使用它编写非常紧凑的函数声明。

转载注明原文:在C中如何声明一个常量函数指针的数组? - 代码日志