2012-11-29 107 views
0

考虑下面的C声明:C声明是什么意思?

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

是什么arr意味着什么?

+0

为什么让一种语言不可读?神.. – Krishnabhadra

+9

使用[cdecl](http://cdecl.ridiculousfish.com/?q=char+%28*+%28+*+%28*+ARR+%29+%28+%29+%29+ [ 8]%29 +%28int%2Cint%29)。 –

+0

看到我的答案[这里](http://stackoverflow.com/a/13592447/1157444) – iabdalkader

回答

3

先从最左边的标识符,那么你的工作方式进行记住[]()*之前绑定,所以*a[]是指针数组,(*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; 

声明arr是指向函数的指针,返回指向返回char的函数的指针的8元素数组的指针。

这里是什么这个看起来像在实际的例子:

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); 

所以,最后一行

  1. 指针引用arr
  2. 调用结果函数(func
  3. 解除引用从func返回的指针,它给了我们阵列(funcArr
  4. 索引查找函数指针i
  5. 指针引用指针给我们的f0一个...f7
  6. 并调用结果函数使得typedef有点更具可读性的

一种方法是做到这一点的阶段:

typedef char CharFunc(int, int); 
typedef CharFunc *CharFuncArray[8]; 
typedef CharFuncArray *ArrayFunc(); 

ArrayFunc *arr; 

就个人而言,我不喜欢做的事情如此方式,因为它不是很明显如何从ArrayFunc *arr

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

而声明l IKE

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

告诉你确切arr应该如何使用。

2

arr是一个指向返回指针到一个阵列8个指针这需要2个参数为INT被返回字符的功能的功能。你一定要检查这个link这将帮助你解码这样复杂的声明。 PS:我建议不要有这样复杂的声明。分解成部分。

+0

而且我建议你不要使用返回指向其他函数指针数组的指针的指针。如果你这样做,你的下一个问题可能是“为什么这不工作?”。 :-) –