我知道void (*)(int)
是指针函数,但void(int)
是什么?
它用于std::function
模板。
说我有一个功能void fun(int){}
:decltype(&fun)
提供void(*)(int)
但decltype(fun)
提供void(int)
答案 0 :(得分:15)
如果T
是一种类型,则T*
表示“指针指向T
”类型。
类型void(int)
是函数类型,它是一个函数的类型,只需一个int
并返回void
。例如,f
如果f
被声明为void f(int);
T = void(int)
如果T*
,则void(*)(int)
拼写为T& = void(&)(int)
,因此后者是函数指针的类型。您还可以形成对函数的引用,即*
;这有时更有用(例如,您可以获取函数左值的地址)。
除了注意:函数lvalues 很容易衰减到它们的函数指针。您可以通过函数左值或函数指针调用函数。当用作间接运算符(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
函数不会衰减的一些唯一时间是用作address-of运算符的操作数,或者当绑定到引用时:
public interface MarkerInterface {
public String print();
}
答案 1 :(得分:8)
void (*whatever)(int)
应该被理解为:无论是指向函数的指针,都接受一个int作为参数,并且不返回任何内容(即,void)。
void whatever(int)
应该被理解为:无论是函数(不是指针),接受一个int作为参数,并且不返回任何内容(即,void)
一旦指向函数的指针被初始化为指向有效函数(满足原型的函数),那么你可以通过它的&#34; real&#34;来调用函数。名称,或通过指针。
指向函数的指针是非常有用的 - 它们是变量,就像其他任何东西一样,所以你可以将它们传递给其他函数(参见例如qsort()),你可以将它们放在结构体中等等。 / p>
鉴于此,以下代码有效:
#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;
}
答案 2 :(得分:3)
void(*)(int)
应该被读作指向function
的指针的类型,它接受一个int
作为参数,并且不返回任何内容。
要了解有关指针及其用法的更多功能,请点击此处:http://www.cprogramming.com/tutorial/function-pointers.html