这个C声明int *(* table())[10]做了什么?

时间:2018-06-12 07:39:42

标签: c

我正在尝试编写C代码来创建函数指针的二维数组,其中每个函数都不带参数并返回int。 我已经尝试过这段代码:

int *(*table())[10];

但它没有用。你知道我该怎么办呢?

2 个答案:

答案 0 :(得分:3)

构建C声明,以便将声明符键入为表达式,从而生成类型。所以,我们假设我们已经有了这样一个2D数组a。如何从中获取int

  1. 索引一次,得到一维数组:a[10]
  2. 再次索引,获取指向函数的指针:a[10][10]
  3. 取消引用指针,获取一个函数:*a[10][10]
  4. 调用该函数,获取int(*a[10][10])()
  5. 所以最后的声明是:

    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数组的函数指针。