我想弄清楚一些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
解析C声明的基本规则是"从右到左阅读,当留下一对括号时,向内跳出右边",即启动最深嵌套的括号对,然后自己向右看.从技术上讲,你必须知道运营商的关联性,但在大多数情况下它运作良好.
现在,我们将此(简化)规则应用于您的问题:
Run Code Online (Sandbox Code Playgroud)double (*b)[n]; ^
b是一个
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 (*b)[n]; ^^^^^^
双打.
Run Code Online (Sandbox Code Playgroud)double (*c[n])(); ^^^^
c是一个数组
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 (*c[n])(); ^^^^^^
返回双倍.
Run Code Online (Sandbox Code Playgroud)double (*d())[n]; ^^^
d是一个函数
Run Code Online (Sandbox Code Playgroud)double (*d())[n]; ^
返回指针
Run Code Online (Sandbox Code Playgroud)double (*d())[n]; ^^^
一个数组
Run Code Online (Sandbox Code Playgroud)double (*d())[n]; ^^^^^^
双打
大多数*nix上都有一个简洁的实用程序,称为cdecl,它接受一个C声明字符串并将其转换为自然语句.