代码之家  ›  专栏  ›  技术社区  ›  prosseek

凌乱的函数指针解释

  •  7
  • prosseek  · 技术社区  · 14 年前

    char (*(*x())[])();
    

    它看起来像以下格式的函数指针数组,但我看不出f->(*x())是什么意思。如何解释这个凌乱的函数指针?

    char (*f[])();
    

    补充

    在约翰·博德的帮助下,我举了一个例子如下。

    #include <stdio.h>
    
    char foo()    { return 'a'; }
    char bar()    { return 'b'; }
    char blurga() { return 'c'; }
    char bletch() { return 'd'; }
    
    char (*gfunclist[])() = {foo, bar, blurga, bletch};
    
    char (*(*x())[])()
    {
      static char (*funclist[4])() = {foo, bar, blurga, bletch};
      return &funclist;
    }
    
    int main() 
    {
      printf("%c\n",gfunclist[0]());
    
      char (*(*fs)[4])();
      fs = x();
      printf("%c\n",(*fs)[1]()); 
    }
    

    我能得到预期的结果。

    smcho@prosseek temp2> ./a.out 
    a
    b
    

    here .

    5 回复  |  直到 7 年前
        1
  •  12
  •   John Bode    14 年前

    我的一般过程是在声明中找到最左边的标识符,然后找出解决方法,记住 [] () 在之前绑定 * (即。, *f() 通常被解析为 *(f()) *a[] 通常被解析为 *(a[])

    所以,

              x           -- x
              x()         -- is a function
             *x()         -- returning a pointer
            (*x())[]      -- to an array
           *(*x())[]      -- of pointers
          (*(*x())[])()   -- to functions
     char (*(*x())[])();  -- returning char
    

    这样的野兽在实践中会是什么样子?

    char foo()    { return 'a'; }
    char bar()    { return 'b'; }
    char blurga() { return 'c'; }
    char bletch() { return 'd'; }
    
    /**  
     *           funclist           -- funclist
     *           funclist[]         -- is an array
     *          *funclist[]         -- of pointers
     *         (*funclist[])()      -- to functions
     *    char (*funclist[])()      -- returning char
     */    
    char (*funclist[])() = {foo, bar, blurga, bletch};
    

    表达 &funclist

    char (*(*x())[])()
    {
      return &funclist;
    }
    
        2
  •  6
  •   Prasoon Saurav    14 年前
    char (*(*x())[])();
    

    x is a function returning pointer to array of pointer to function returning char

    char (*f[])();
    

    在这种情况下 f is an array of pointer to function returning char

    right-left rule 会有好处的。

        3
  •  5
  •   user470379    14 年前
    cdecl> explain char (*(*x())[])();
    declare x as function returning pointer to array of pointer to function returning char
    
        4
  •  3
  •   sth ACP    14 年前

    一些typedef使它更清晰:

    typedef char (*charfunc_t)();
    

    charfunc_t 作为指向不带返回的参数的函数的指针 char .

    typedef charfunc_t funcarr_t[];
    

    funcarr_t

    x 是返回指向此类数组的指针的函数,现在可以这样声明:

    funcarr_t* x();
    
        5
  •  2
  •   t0mm13b    14 年前

    访问此网站以帮助您理解c声明( cdecl.org ),如果你输入上面的内容,它会告诉你

    将x声明为返回指向返回char的函数指针数组的函数