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

Joe*_*ley 16 c declaration

我想弄清楚一些C声明.这些C声明的含义是什么?

double (*b)[n];
double (*c[n])();
double (*d())[n];
Run Code Online (Sandbox Code Playgroud)

Arm*_*yan 12

double (*b)[n];
Run Code Online (Sandbox Code Playgroud)

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

double (*c[n])();
Run Code Online (Sandbox Code Playgroud)

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

double (*d())[n];
Run Code Online (Sandbox Code Playgroud)

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

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

 double (*d())[n];
Run Code Online (Sandbox Code Playgroud)

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

让我们看另一个例子

 void (*(*f)(int)[n])(char)
Run Code Online (Sandbox Code Playgroud)

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

HTH

  • 您可能还想查看http://cdecl.org/,其中将"C gibberish翻译为英语". (2认同)

dat*_*olf 9

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

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


double (*b)[n];
         ^
Run Code Online (Sandbox Code Playgroud)

b是一个

double (*b)[n];
        ^
Run Code Online (Sandbox Code Playgroud)

指针

double (*b)[n];
           ^^^
Run Code Online (Sandbox Code Playgroud)

和数组

double (*b)[n];
^^^^^^
Run Code Online (Sandbox Code Playgroud)

双打.


double (*c[n])();
         ^^^^
Run Code Online (Sandbox Code Playgroud)

c是一个数组

double (*c[n])();
        ^
Run Code Online (Sandbox Code Playgroud)

指向

double (*c[n])();
              ^^
Run Code Online (Sandbox Code Playgroud)

功能

double (*c[n])();
^^^^^^
Run Code Online (Sandbox Code Playgroud)

返回双倍.


double (*d())[n];
         ^^^
Run Code Online (Sandbox Code Playgroud)

d是一个函数

double (*d())[n];
        ^
Run Code Online (Sandbox Code Playgroud)

返回指针

double (*d())[n];
             ^^^
Run Code Online (Sandbox Code Playgroud)

一个数组

double (*d())[n];
^^^^^^
Run Code Online (Sandbox Code Playgroud)

双打


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