繁体   English   中英

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

[英]difference between void(int) & void (*)(int)

我知道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如果f被声明为void f(int);

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


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

printf("Hello world\n");        // OK
(*printf)("Hello world\n");     // also OK
(****printf)("Hello world\n");  // four-star programmer

函数不衰减的一些唯一时间是用作address-of运算符的操作数,或者绑定到引用时:

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 %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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM