簡體   English   中英

C中沒有名稱的函數指針

[英]Function pointer without a name in C

一個普通的函數指針看起來像這樣:

void (*fun_ptr)(void);

但是,我已經看到這種語法用於將某些內容轉換為 void 函數指針:

(void (*)(void *))

如您所見,它沒有名稱,只有(*)代替名稱。 這是什么意思? 僅用於鑄造嗎?

語法(void (*)(void *))是一個強制轉換。

轉換的目標類型是一個函數指針,它接受一個void *類型的參數並返回void 類型與此強制轉換匹配的函數的示例是:

void abc(void *param);

void (*)(void *)是一種類型。 它在概念上類似於int * 它也沒有與之關聯的標識符。 void (*foo)(void *)是具有該類型的變量foo的聲明。

強制轉換表達式的形式為(<type>)<expr> 因此, (void (*)(void *))可以是強制轉換運算符。

但是,這種形式不限於強制轉換表達式。 它可以在任何類型可以使用的地方使用。 例如,作為函數原型中的參數類型:

void bar(void (*)(void *));

這聲明了一個函數bar ,它將函數指針作為參數。

在 C 中,標准所稱的“類型名稱”(類型轉換中的類型,或 sizeof 的參數)與該類型變量的聲明具有完全相同的形式,只是沒有變量。 變量的聲明反映了它的用途。 在您的情況下,使用指向接收 void 指針並返回 void 的函數的指針,例如

(*f)(p) ,

所以它的聲明是

void (*f)(void *P) ,

(注意p的嵌套類型聲明!),相應的轉換是

(void (*)(void *))

這是一個簡單、強大且合乎邏輯的原則; 但一個結果是,對於復雜類型,變量名出現在聲明的中間,就像在相應的表達式中一樣。

有趣的是,類型名中只有一個變量名的位置(遞歸地應用於函數中的嵌套類型); 類型名稱是明確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM