C声明表示什么?

时间:2012-11-29 11:44:28

标签: c

考虑以下C声明:

typedef char (* ( * (* ARR ) ( ) ) [8]) (int,int) ;    
ARR arr;

arr表示什么?

3 个答案:

答案 0 :(得分:3)

arrpointer to a function returning pointer to an array of 8 pointers to a function which takes 2 int as an argument returning char

有关详情,请参阅this naming of complex declarations using clockwise/spiral rule

答案 1 :(得分:3)

从最左边的标识符开始,然后在[]之前记住()*绑定,然后*a[]是一个指针数组{{1}是一个指向数组的指针,(*a)[]是一个返回指针的函数,*f()是一个指向函数的指针:

(*f)()

所以

typedef                ARR                           -- ARR is a typedef for
                    (* ARR )                         -- a pointer
                    (* ARR ) ( )                     -- to a function
                ( * (* ARR ) ( ) )                   -- returning a pointer
                ( * (* ARR ) ( ) ) [8]               -- to an 8-element array
             (* ( * (* ARR ) ( ) ) [8])              -- of pointers
             (* ( * (* ARR ) ( ) ) [8]) (       )    -- to functions
             (* ( * (* ARR ) ( ) ) [8]) (int,int)    --   taking two int parameters
typedef char (* ( * (* ARR ) ( ) ) [8]) (int,int) ;  --   and returning char

声明ARR arr; 是一个指向函数的指针,该函数返回指向返回char的函数的8元素指针数组的指针。

这是一个在实践中会出现这种情况的例子:

arr

所以,最后一行

  1. 取消引用char f0(int a, int b) { ... } char f1(int x, int y) { ... } char f2(int g, int h) { ... } ... char f7(int r, int s) { ... } // funcArr is an *array* of pointers to functions, not a function char (*funcArr[8])(int, int) = {f0, f1, f2, f3, ..., f7}; // func is a function that will return the funcArr array char (*(*func())[8])(int,int) { return funcArr; } arr = func; char c = (*(*(*arr)())[i])(x,y);
  2. 调用结果函数(arr
  3. 取消引用从func返回的指针,它为我们提供了数组(func
  4. 在索引funcArr
  5. 处找到函数指针
  6. 取消引用 指针给我们一个i ... f0
  7. 并调用生成的函数
  8. 使f7更具可读性的一种方法是分阶段进行:

    typedef

    就个人而言,我不喜欢以这种方式做事,因为你从typedef char CharFunc(int, int); typedef CharFunc *CharFuncArray[8]; typedef CharFuncArray *ArrayFunc(); ArrayFunc *arr;

    的方式并不明显
    ArrayFunc *arr

    而声明如

    char c = (*(*(*arr)())[i])(x,y);
    

    告诉你完全应该如何使用char (*(*(*arr)())[8])(int,int);

答案 2 :(得分:2)

arr是一个指向函数的指针,该函数返回指向数组的指针8指向函数的指针,该函数将2个参数作为int返回字符。你肯定需要检查这个link,它将帮助你解码这些复杂的声明。

PS:我建议不要有这么复杂的声明。将其分解为部分。