簡體   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