void(int) 和 void (*)(int) 之间的区别

difference between void(int) & void (*)(int)

本文关键字:void int 区别 之间      更新时间:2023-10-16

我知道void (*)(int)是函数指针,但void(int)是什么?

用于std::function模板。

假设我有一个函数void fun(int){}decltype(&fun)给出void(*)(int),但decltype(fun)给出void(int)

如果T是一个类型,则T*表示类型"指向-T的指针"。

类型void(int)函数类型,它是取一个int并返回void的函数的类型。例如,如果f被声明为void f(int); ,则它是f的类型

如果T = void(int),则T*拼写为void(*)(int),因此后者是函数指针的类型。您还可以形成对一个函数的引用,该函数为T& = void(&)(int);这有时更有用(例如,您可以获取函数lvalue的地址)。


注意:函数lvalues很容易衰减到它们的函数指针。您可以通过函数左值或函数指针调用函数。当用作间接运算符(*)的操作数时,函数值会衰减,因此您可以一次又一次地取消引用指针:

printf("Hello worldn");        // OK
(*printf)("Hello worldn");     // also OK
(****printf)("Hello worldn");  // 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
void (*whatever)(int) 

应该读作:无论是指向函数的指针,它接受一个int作为参数,但不返回任何内容(即void)。

void whatever(int)

应该读作:无论是一个函数(而不是指针),它接受一个int作为参数,并且不返回任何内容(即void)

一旦一个函数的指针被初始化为指向一个有效的函数(一个满足原型的函数),那么您就可以通过它的"真实"名称或通过指针调用该函数。

指向函数的指针非常有用——它们是变量,就像其他任何东西一样,所以你可以将它们传递给其他函数(参见例如qsort()),你可以将其放入结构中,等等

鉴于此,以下代码是有效的:

#include <stdio.h>
void myfun(int x) {
  printf("The value of X is %dn", 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