之間的區別我知道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