我正在尝试编写C代码来创建函数指针的二维数组,其中每个函数都不带参数并返回int
。
我已经尝试过这段代码:
int *(*table())[10];
但它没有用。你知道我该怎么办呢?
答案 0 :(得分:3)
构建C声明,以便将声明符键入为表达式,从而生成类型。所以,我们假设我们已经有了这样一个2D数组a
。如何从中获取int
?
a[10]
。a[10][10]
*a[10][10]
int
:(*a[10][10])()
所以最后的声明是:
int (*a[10][10])(void);
当然,像往常一样,使用typedef
s:
typedef int Fun(void);
typedef Fun *FunPtr;
FunPtr a[10][10];
答案 1 :(得分:0)
关于你提出的声明,这是一个非常棘手的声明。您可以使用clockwise/spiral rule来展开它。
基本上table()
部分意味着它是一个功能。 ()
是过时的C,意味着一个函数接受任何参数。您应该使用(void)
代替。
int* (* ... ) [10]
部分意味着您有一个函数将数组指针返回到数组int* [10]
。当在函数返回值之外写入时,这样的数组指针通常被声明为int* (*name)[10]
。
所以你有一个函数声明,一个返回一个数组指针的函数,到一个10 int *的数组,该函数正在采用一个过时的样式参数列表。
您可以通过此示例更好地理解它:
typedef int* (*arrptr)[10]; // to illustrate, typedef an array pointer int* (*)[10]
typedef arrptr func_t (void); // typedef a function type returning said array pointer
void func (func_t* x){}
// dummy function to demonstrate type compatibility, funct_t* is a function pointer
int *(*table(void))[10]; // function declaration
int main (void)
{
func(table); // table is of same type as the function pointer func_t*
return 0;
}
int *(*table(void))[10]
{
return 0;
}
请注意,隐藏在typedef后面的数组和指针通常是不好的做法。
关于如何获取函数指针数组,它比解释上面的乱码要简单明了。
int* func (void)
这是一个功能。int* (*func) (void)
这是指向此类函数的函数指针。int* (*func[10][10]) (void)
这是一个2D数组的函数指针。或者最好:
typedef int* func_t (void)
这是一种功能类型。func_t* fptr
这是指向此类函数的函数指针。func_t* fptr[10][10]
这是一个2D数组的函数指针。