我正在试图弄清楚一些C声明。这些C声明的含义是什么?
double (*b)[n];
double (*c[n])();
double (*d())[n];
答案 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