arrays - 可以从指针数组中的值初始化指针吗?

标签 arrays c pointers initialization

我基本上想要一个函数列表作为函数指针数组;然后我想管理该数组中的索引变量和接受该数组中的值的指针变量。考虑下面的 C 代码来说明这一点,它可以正常编译:

#include <stdio.h>

void func_01() {
    printf("func_01\n");
}
void func_02() {
    printf("func_02\n");
}
void func_03() {
    printf("func_02\n");
}

enum func_choice_e {
    eFUNC01 = 0,
    eFUNC02 = 1,
    eFUNC03 = 2,
#define _NUM_FUNC_CHOICE 3
    NUM_FUNC_CHOICE = _NUM_FUNC_CHOICE,
};
typedef enum func_choice_e func_choice_t;

void* funcs_ptrs[_NUM_FUNC_CHOICE] = {
    &func_01,
    &func_02,
    &func_03,
};

func_choice_t my_func_choice_idx = eFUNC01;
void* my_func_choice_ptr = &func_01;

int main()
{
    my_func_choice_idx = eFUNC02;
    my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
    printf("Hello World %p\n", my_func_choice_ptr);

    return 0;
}

如上面的代码所示,在代码中我可以通过索引变量( my_func_choice_ptr = funcs_ptrs[my_func_choice_idx]; )设置指针变量。

但是,我想做类似的事情,也用于初始化 - 最终,我只想初始化数组值和 my_func_choice_idx首先手动 - 然后让指针自动初始化到相应的 my_func_choice_idx数组中的第元素;所以代替工作指针初始化器:

void* my_func_choice_ptr = &func_01;

...我已经尝试过这些:

//void* my_func_choice_ptr = funcs_ptrs[my_func_choice_idx]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[eFUNC01]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[0]; // error: initializer element is not constant

...正如评论中的错误消息所暗示的那样,这些都不起作用。

我有点明白为什么funcs_ptrs[my_func_choice_idx]可能会失败 - my_func_choice_idx毕竟是一个变量——但是当编译器到达 my_func_choice_ptr = funcs_ptrs[0]; 时,它应该已经“知道” funcs_ptrs 的地址、大小和初始值。 -> 所以我不明白为什么它不能设置 my_func_choice_ptrfuncs_ptrs 的第一个条目?!

那么 - 是否有一些语法可以用于初始化,这将允许我将指针变量初始化为数组中条目的给定初始值(类似于赋值 my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];这在正常代码中有效)?

最佳答案

您声明的函数指针是错误的。函数指针不是 void* 但需要有正确的签名:

typedef void(*func_ptr)(void);

然后您可以像这样使用:

const func_ptr funcs_ptrs[_NUM_FUNC_CHOICE] = {
    &func_01,
    &func_02,
    &func_03,
};

func_choice_t my_func_choice_idx = eFUNC01;
func_ptr my_func_choice_ptr = funcs_ptrs[eFUNC01];

如果您想使用 my_func_choice_idx 初始化它,则无法全局执行此操作,因为它不是常量,但您可以在 main 中执行此操作:

int main(void) {
    func_ptr my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
}

关于arrays - 可以从指针数组中的值初始化指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76939001/

相关文章:

javascript - 返回单击时选中的所有复选框的数组

c - 宏空白

c++ - STM32 NVIC ADC 中断未触发

c - 访问超出为指针分配的内存的索引

java - 排列字符数组

c++ - 从 boost::array<char, 100> 中提取字符集

c - 以某些数字打印数字

pointers - 复制包含指向 CUDA 设备的指针的结构

c++ - 将 vector 的 vector 转换为指针的指针

c - Objective-C 全局整数数组未按预期工作