之间的区别我知道void (*)(int)
是函数指针,但是什么是void(int)
?void(int)&void(*)(int)
它用于std::function
模板。
说我有一个功能void fun(int){}
:decltype(&fun)
给出void(*)(int)
但decltype(fun)
给出void(int)
之间的区别我知道void (*)(int)
是函数指针,但是什么是void(int)
?void(int)&void(*)(int)
它用于std::function
模板。
说我有一个功能void fun(int){}
:decltype(&fun)
给出void(*)(int)
但decltype(fun)
给出void(int)
如果T
是一种类型的,那么T*
表示类型 “指针-TO-T
”。
类型void(int)
是功能型,它是采取一个int
并返回void
函数的类型。例如,它是f
类型如果f
被声明为void f(int);
如果T = void(int)
,然后T*
拼写void(*)(int)
,所以后者是函数指针的类型。你也可以形成一个函数的参考,它是T& = void(&)(int)
;这有时会更有用(例如,您可以将函数左值的地址)。
除了注意:功能很容易左值衰减自己的函数指针。您可以通过函数左值或通过函数指针调用函数。当作为间接寻址运算符(*
)的操作使用,函数值衰减,这样你就可以提领连连指针:
printf("Hello world\n"); // OK
(*printf)("Hello world\n"); // also OK
(****printf)("Hello world\n"); // four-star programmer
有的只是时间的一个函数不衰的使用时,地址的操作者的操作数,或当结合于一个参考:
void f(int); // our example function
void(*p1)(int) = &f; // no decay of "f" here
void(*p2)(int) = f; // "f" decays
void(&r1)(int) = f; // no decay of "f" here
void g(void(&callback)(int), int n) {
callback(n);
}
g(f, 10); // no decay of "f" here
template <typename F, typename ...Args>
decltype(auto) h(F&& callback, Args&&... args) {
return std::forward<F>(callback)(std::forward<Args>(args)...);
}
h(f, 10); // no decay of "f" here
注意:在(几乎?)每个场景中C++模板替换以及“直接调用函数”这样简单的例子,[函数类型在使用时降级为函数指针](http://stackoverflow.com/a/19200555/364696),所以没有区别。我怀疑在模板的情况下,函数是模板定义的一部分,如果可能的话(如果它实际上不使用存储非constexpr函数指针的变量),编译器会内联并撤销函数的指针性。 – ShadowRanger
我可以有一个类型为void(int)的var,以及如何为其赋值? – Derek
@Derek:不,你不能有函数类型的变量,你不能有函数类型的prvalues,函数的返回值不能是函数类型。 –
void (*whatever)(int)
应当被理解为:无论是一个指针,指向一个函数,它接收一个INT作为参数,并返回没有任何东西(即无效)。
void whatever(int)
应该读作:无论是一个函数(不是指针),接受一个int值作为参数,并且没有返回
一旦指向函数初始化(即无效。)指向一个有效的函数(满足原型的函数),那么你可以通过它的“真实”名称或通过指针来调用函数。
函数指针是非常有用的 - 他们是变量,就像别的,这样你就可以通过他们周围的其他功能(例如见的qsort()),你可以把它们放在结构等。
鉴于此,下面的代码是有效的:
#include <stdio.h>
void myfun(int x) {
printf("The value of X is %d\n", x);
}
int main() {
void (*myfunp)(int);
myfunp = &myfun;
myfun(13);
myfunp(12);
return 0;
}
void(*)(int)
应该读作类型,是指向function
指针,接受一个int
作为参数,并且没有返回。
为了解更多关于函数指针和其用法请点击这里:http://www.cprogramming.com/tutorial/function-pointers.html
[回调函数:void之间的'差(* FUNC)(INT)'和'无效(FUNC)(INT)']( http://stackoverflow.com/q/25953542/995714) –
@LưuVĩnhPhúc如果您认为这是重复的,您应该将其标记为 – acupajoe
它不是重复的。这个问题是关于一个函数类型声明的函数参数。 – interjay