【发布时间】:2018-03-07 10:23:29
【问题描述】:
我想创建一个函数,它返回一个函数指针数组指针(即一个指针指向一个数组,其元素是函数指针)。我这样声明:
void (*(*getFuncArrayPointer(int flag)))[3]{}
但我得到了错误:
returnFuncAttrPointer.c:27:10: error: declaration of ‘getFuncArrayPointer’ as array of voids
returnFuncAttrPointer.c:28: confused by earlier errors, bailing out
Preprocessed source stored into /tmp/ccYiPPru.out file, please attach this to your bugreport.
它解析的数组的元素类型好像是void。
这是我的全部代码:
#include <stdio.h>
typedef void (*FUNC)(int);
static void func1(int num)
{
printf("This is func1. num=%d\n", num + 1);
}
static void func2(int num)
{
printf("This is func2. num=%d\n", num + 2);
}
static void func3(int num)
{
printf("This is func3. num=%d\n", num + 3);
}
FUNC funcArray1[] = {func1, func2, func3}; // Function Pointer Array
FUNC funcArray2[] = {func3, func2, func1}; // Function Pointer Array
/* Function Pointer Array Pointer used as a return type */
/* Fcuntion: getFuncArrayPointer(int flag) ==> func Return type: void (*(*func))[3] ==> Array Pointer ==>
* Array Pointer: Array--(*)[3] Elemnet--void (*func) ==> void (*funcArray(int start)) ==> Function Pointer
*/
void (*(*getFuncArrayPointer(int flag)))[3]
{
switch(flag)
{
case 1:
return &funcArray1;
case 2:
return &funcArray2;
default:
return NULL;
}
}
int main()
{
int num;
// (*pfuncArray)[3] ==> Array Pointer
// void (*)(int) ==> Function Pointer
void (*(*pfuncArray[3]))(int); // Function Pointer Array Pointer
printf("input a number: ");
scanf("%d", &num);
pfuncArray = getFuncArrayPointer(num);
if(pfuncArray)
{
(*funcArray)[0](num);
(*funcArray)[1](num);
(*funcArray)[2](num);
}
return 0;
}
GCC 版本: gcc (GCC) 4.6.2 20111027 (红帽 4.6.2-1) 版权所有 (C) 2011 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有 保修单;甚至不是为了适销性或特定用途的适用性。
操作系统: Linux sslvpn 3.6.10-2.fc16.i686.PAE #1 SMP Tue Dec 11 19:10:54 UTC 2012 i686 i686 i386 GNU/Linux
【问题讨论】:
-
返回时,我建议您让数组衰减到指向其第一个元素的指针,您只需执行例如
return funcArray1。那么你的函数的返回类型只是一个指向FUNC的指针,即FUNC *。 -
类型定义。再次使用它。
-
@Someprogrammerdude 我将函数更改为 FUNC* getFuncArrayPointer(int flag) 并返回 funcArray1。然后我调用了 (*(pfnc + 1))(num),它运行良好。但是我怎样才能返回一个固定大小的数组呢?
-
因为
typedef是你的朋友。创建一个别名(typedef名称),它是FUNC对象的数组。就像例如typedef FUNC FUNC_ARRAY[3];。然后将该类型用作返回类型。 -
@Someprogrammerdude 我将函数更改为 FUNC (*getFuncArrayPointer(int flag))[3] 并且效果很好。非常感谢!最后一个问题,如何直接声明函数(即不使用 typedef)?我知道这毫无意义,但我只想知道。
标签: c arrays function pointers function-pointers