Alo*_*kin 7 c syntax pointers function-pointers
我在C中遇到以下语法问题:
float (*func(unsigned id))(float value) {
...
}
Run Code Online (Sandbox Code Playgroud)
我明白那个:
funcfunc接受一个unsigned被称为类型的参数idfunc 返回一个指向如下函数的指针: float f(float value) 但我不明白为什么f(返回的函数指针)的返回值与其参数列表分开.
另外,是:func(unsigned id)一个表达式,计算一些指针?这是为什么(*func(unsigned id))有效的原因?
有人可以一步一步澄清这种语法吗?
该表达式func(id)返回一个指向函数的指针,该函数将float作为参数并返回一个float.
float(*f)(float v); // pointer to a function
float val;
f = func(3); // returns a pointer to a function
val = (*f)(3.14); // calls the function pointed to with argument 3.14
Run Code Online (Sandbox Code Playgroud)
当然,你可以重写最后一个语句:
val = (*func(3))(3.14); // take the ptr returned by func(3) and call the function pointed to.
Run Code Online (Sandbox Code Playgroud)
如果你有这样的功能:
float fct1 (float v) { return 2.0f*v+3.1f; }
Run Code Online (Sandbox Code Playgroud)
你可以写:
f = fct1; // reassign the pointer to function f to the adress of fct1
Run Code Online (Sandbox Code Playgroud)
我们来看看语法.C11标准(草案N1570)在6.5.2.2中指出第1点:"表示被调用函数的表达式"应具有指向函数的类型指针"并且在第3点中: "后缀表达式后跟包含可能的括号()空的,以逗号分隔的表达式列表是一个函数调用."
这当然涵盖了通常情况:
val = fct1 (3.14); // fct1 is the function designator which adresses the function
val = (*f) (3.14); // (*f) the dereferenced function pointer, so it addresses the function
Run Code Online (Sandbox Code Playgroud)
但以下内容也符合标准:
val = f(3.14); // This works as well, because f is a pointer to a function
val = func(3)(3.14) // works also because func(3) is a pointer to a function
Run Code Online (Sandbox Code Playgroud)
然而,对于人类读者来说,第一个表达式是模棱两可的,他们可能会认为f是函数指示符,期望它在某个地方定义.第二个也是不寻常的.此外,早期版本的C不承认它们.我1978年的K&R版本要求使用形式(*f)()来调用函数指针.
最后一句语法注释:如果你要定义f,因为float *f (float);它不会被理解为指向函数的指针,而是作为一个名为f的普通函数的前向声明并返回指向float的指针.为什么?因为C优先级规则给出()的优先级高于*编译器将其理解为的优先级(float *)(f(float)).这就是为什么需要显式括号来表明它(*f)是函数指针的原因.
float (*func(unsigned id))(float value);
Run Code Online (Sandbox Code Playgroud)
是一个函数的声明,它接受一个unsigned int作为参数并返回一个指向函数的指针。
指针指向的函数(函数f)以一个浮点数作为参数并返回浮点数。它的声明是:
float f(float value);
Run Code Online (Sandbox Code Playgroud)
该名称的的func功能:
float (*func(unsigned id))(float value);
^^^^
Run Code Online (Sandbox Code Playgroud)
函数的参数func:
float (*func(unsigned id))(float value);
^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
函数的返回类型func:
float (*func(unsigned id))(float value);
^^^^^^^^ ^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
如果函数没有参数,它看起来像这样:
float (*func())(float value);
Run Code Online (Sandbox Code Playgroud)
你问:另外,是:func(unsigned id)一个计算为某个指针的表达式?
不,它是函数的名称func和参数(unsigned id)
你现在开始明白是func什么了吗?它是一个函数,它返回一个指向另一个声明函数的指针。
我包含了代码,您可以在其中明确看到与func函数的引用相比,函数的返回值是什么f。
#include <stdio.h>
float f(float value);
float (*func(unsigned id))(float value);
int main()
{
/* print the address of the f function
* using the return value of function func
*/
printf("func return value: %p\n\n", func(2));
/* print the address of the f function referencing
* its address
*/
printf("referencing f address: %p\n", &f);
return 0;
}
float (*func(unsigned id))(float value)
{
printf("Original function with argument id = %d called\n", id);
return f;
}
float f(float value)
{
printf("f function\n");
return 0.1;
}
Run Code Online (Sandbox Code Playgroud)
在C gibberish↔English的帮助下逐步采取这一步骤
float (*func(unsigned id))(float value) { ... }
Run Code Online (Sandbox Code Playgroud)
首先用"f"替换"func",因为那个漂亮的网站有"func"的问题,然后删除参数名称.
float (*f(unsigned ))(float )
// declare f as function (unsigned) returning pointer to function (float) returning float
Run Code Online (Sandbox Code Playgroud)
由此,f是一个函数声明unsigned id.那是f(unsigned )一部分.
它返回一个变量x,就像它被声明一样float (*x)(float ).正如OP观察到的那样,前半部分与函数原始声明中的后半部分是分开的.
建议尝试使用该网站记住不要使用"func"
例子:
int f2(unsigned );
// declare f2 as function (unsigned) returning int
int (*f3(unsigned ));
// declare f3 as function (unsigned) returning pointer to int
int (*f4)(unsigned );
// declare f4 as pointer to function (unsigned) returning int
int (*f5(unsigned ))(char);
// declare f5 as function (unsigned) returning pointer to function (char) returning int
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1820 次 |
| 最近记录: |