C语言中如何返回指向函数指针数组的指针?
正确实现方案
首先明确现有类型的基础构成,避免类型匹配错误:
- 已定义的
test类型:本质是无参数、返回值为uint32_t的函数指针 - 静态常量数组
tests:本质是元素为const test类型的只读数组,数组内每个元素都是符合test签名的函数指针
要返回指向该函数指针数组的指针,最稳妥、可读性最高的方式是通过typedef逐层定义对应类型,规避原生数组指针语法容易写错括号匹配的问题。
分步实现流程
- 定义和现有数组匹配的类型别名
先明确数组的实际长度(避免硬编码数字后续维护出错),依次定义数组类型、数组指针类型:// 先标记数组实际元素个数,可结合实际元素调整 #define TEST_ARRAY_ELEM_CNT 5 // 定义数组本身的类型:存放TEST_ARRAY_ELEM_CNT个const test元素的数组 typedef const test test_array_t[TEST_ARRAY_ELEM_CNT]; // 定义指向上述数组的指针类型 typedef test_array_t *test_array_ptr_t; - 编写返回该指针的函数
因为tests数组的类型和定义的test_array_t完全匹配,直接取整个数组的地址返回即可:test_array_ptr_t get_tests_array(void) { // 必须取数组的地址&tests,而非直接返回tests // 直接返回tests会让数组名隐式退化为指向首元素的指针,和目标类型不匹配 return &tests; }
易错注意事项
- 不要直接返回数组名
tests:数组名在大多数表达式中会隐式转换为指向首元素的指针,对应类型为const test *,和“指向整个数组的指针”类型不兼容,会触发编译警告甚至错误。 - 不要丢失const限定:因为原数组是
static const修饰的只读内容,返回的指针类型必须保留对应的const属性,否则会触发“将const权限从只读转为可修改”的编译报错。 - 如果确实不想定义多层typedef,也可以直接写原生的函数返回签名,和前面的typedef写法完全等价,但可读性较差,括号匹配容易写错:
// 等价原生签名:返回指向包含5个const test元素数组的指针 const test (*get_tests_array(void))[5];
内容的提问来源于stack exchange,提问作者pranathi
相关产品推荐
相关产品推荐

