找出C声明如:double(* b)[n]

时间:2012-11-06 08:52:34

标签: c declaration

我正在试图弄清楚一些C声明。这些C声明的含义是什么?

double (*b)[n];
double (*c[n])();
double (*d())[n];

4 个答案:

答案 0 :(得分:12)

double (*b)[n];

b是指向n个双精度数组的指针

double (*c[n])();

c是指向函数的n个指针的数组,这些函数采用未指定数量的参数并返回double

double (*d())[n];

d是一个接收未指定数量的参数并返回指向n个双精度数组的指针的函数

通常,为了解析这些声明,请采取以下方法。让我们看看最后一个声明,例如

 double (*d())[n];

对d做的第一件事是什么?它用()来调用,因此它是一个接受未指定数量的参数和returnig的函数 ...结果是做什么的?它被解除引用(*),因此它是指向的指针。结果然后被索引,因此它是一个n 的数组......剩下的是什么?双倍,因此双打。用粗体阅读部分,你会得到答案。

让我们看另一个例子

 void (*(*f)(int)[n])(char)

这里, f 首先取消引用,因此它是指向的指针...然后用(int)调用它,因此函数取int并返回,结果然后用[n]索引,所以数组n 。结果再次被取消引用,因此指向。然后结果由(char)调用,所以函数采用char 并返回(所有剩下的都是空的) void 。所以f是一个指向函数的指针,该函数接受int并返回一个n指针数组,这些指针指向带有char并返回void 的函数。

HTH

答案 1 :(得分:9)

解析C声明的基本规则是“从右到左阅读,当留下一对括号时向内跳出右边”,即启动最深嵌套的括号对,然后自己看看正确的。从技术上讲,你必须知道操作员的关联性,但在大多数情况下它都能很好地运作。

现在让我们将此(简化)规则应用于您的问题:


double (*b)[n];
         ^

b是

double (*b)[n];
        ^

指向

的指针
double (*b)[n];
           ^^^

和数组

double (*b)[n];
^^^^^^

的双打。


double (*c[n])();
         ^^^^

c是

的数组
double (*c[n])();
        ^

指向

的指针
double (*c[n])();
              ^^

功能

double (*c[n])();
^^^^^^

返回双倍。


double (*d())[n];
         ^^^

d是一个函数

double (*d())[n];
        ^

返回指向

的指针
double (*d())[n];
             ^^^

的数组
double (*d())[n];
^^^^^^

双打


在大多数* nix上都有一个简洁的实用程序,名为 cdecl ,它接受一个C声明字符串并将其转换为自然语句。

答案 2 :(得分:4)

试试这个。

首先,你应该熟悉这三个符号:

1. *  -- a pointer.
2. [] -- an array.
3. () -- a function.(notice: not parentheses)

我们以“double(* d())[n]”为例。

第一步是找出声明中的标识符,标识符是变量的名称,这里是“d”。

(i)
-- what is "d"?
------------------------------------------------------------------------
look to the right side of the identifier, to see if there is a "[]" or a "()" :
...d[]...: d is an array.
...d()...: d is a function.

if neither, look to the left side, to see if there is a "*" :
...*d...: d is a pointer.
------------------------------------------------------------------------

现在我们发现d是一个函数。 使用x代替d(),然后声明变为“double(* x)[n]”

(ii)
-- what is "x"?
------------------------------------------------------------------------
repeat (i), we find that x is a pointer.
that means, d is a function returning a pointer.
------------------------------------------------------------------------

使用y替换* x,然后声明变为“double y [n]”

(iii)
-- what is "y"?
------------------------------------------------------------------------
repeat (i), we find that y is an array of n elements.
that means, d is a function returning a pointer to an array of n elements.
------------------------------------------------------------------------

使用z代替y [n],然后声明变为“double z”

(iv)
-- what is "z"?
------------------------------------------------------------------------
repeat (i), we find that z is a double.
that means, d is a function returning a pointer to an array of n double elements.
------------------------------------------------------------------------

让我们看另一个表达式:

void (*(*f)(int)[n])(char)
1.
  we find f.
2.
  f is a pointer. *f -> a
  void (*a(int)[n])(char)
3.
  a is a function. a() -> b
  void (*b[n])(char)
  --f is a pointer to a function (with an int parameter)--
4.
  b is an array. b[] -> c
  void (*c)(char)
  --f is a pointer to a function returning an array (of n elements)--
5.
  c is a pointer. *c -> d
  void d(char)
  --f is a pointer to a function returning an array of n pointers--
6.
  d is a function returning void.
  --f is a pointer to a function returning an array of n pointers to functions (with a char parameter) returning void--

答案 3 :(得分:1)

有两个很好的资源可以理解“C乱码”:

cdecl.org的输出:

  • double (*c[n])():语法错误(此处n无效)
  • double (*c[])():将c声明为函数返回double
  • 的指针数组