gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:25:25 25 4
gpt4 key购买 nike

我需要像这样声明一个指向函数的指针数组:

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

是一个由 5 个返回 void 且不带参数的函数组成的数组。但是函数本身是不能塞进数组的!它们不是对象。只有指向它们的指针可以。

关于

void * t[5](void);

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

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

这确实有效。 t 是一个包含 5 个指针的数组,这些指针指向返回 void 且不带参数的函数

太棒了!指向 arras 的指针数组怎么样?这非常相似。元素类型显示在左侧,维度显示在右侧。同样,需要括号,否则数组将成为整数指针的多维数组:

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

就是这样! 5 个指向 3 个 int 数组的指针数组

函数呢?

我们刚刚学到的关于函数的知识也是正确的。让我们声明一个接受 int 的函数,该函数返回指向另一个不接受参数并返回 void 的函数的指针:

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

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

f(10)();

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

这个呢?

f(10)(true)(3.4);

?换句话说,一个函数接受 int 并返回一个指向函数的指针,该函数接受 bool 并返回一个指向一个接受 double 并返回 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 代表常量或非常量。例如

int const * const * name;

将声明 name 的类型为 pointer to a constant pointer to a constant int。您可以更改 name,但不能更改 *name,它属于

类型
int const * const

也不是 **name,它的类型是

int const

让我们将其应用于上面的函数指针:

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

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

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

结论

C++ 和 C 声明函数和数组的方式实际上有点困惑。您必须先了解它,但如果您理解了它,就可以使用它编写非常紧凑的函数声明。

关于c - 如何在 C 中声明一组常量函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/337449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com