#include <stdio.h>
void hello() {
printf("hello world\n");
}
int main() {
void *(*gibberish)() = (void *(*)())hello;
(*gibberish)();
void (*simple)() = &hello;
(*simple)();
return 0;
}
$ cc pt_func.c && ./a.out
hello world
hello world
嗨,指向 c 函式的指標讓我感到困惑。第二個定義(簡單)非常明確:我們獲取 hello 的地址,并將其放在指向我們可以使用的函式的指標中。
但是,第一個對我來說有點奇怪。為什么它有效?如何將 void 函式轉換為 void 函式指標,回傳指向 void 的指標?
編譯器如何處理這樣的演員表?
uj5u.com熱心網友回復:
hello首先,根據 C 2018 6.3.2.1 4,當在運算式中使用函式指示符(包括函式名稱,例如)時,它會自動轉換為指向函式的指標,而不是作為sizeofunary 或 unary的運算元。所以&, 在 中void (*simple)() = &hello;,&是不需要的; void (*simple)() = hello;會自動使用函式的地址。這解釋了為什么&在void *(*gibberish)() = (void *(*)())hello;.
其次,演員表的定義是因為 C 6.3.2.3 8 說
指向一種型別的函式的指標可以轉換為指向另一種型別的函式的指標,然后再回傳;結果應與原始指標相等...
但是,此轉換旨在允許將函式指標臨時轉換為通用型別,以便可以存盤它。檢索指標時,應在使用它呼叫函式之前將其轉換回適當的型別。第 8 段繼續:
…如果轉換后的指標用于呼叫型別與參考型別不兼容的函式,則行為未定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/438302.html
上一篇:為什么引數的值不會改變?
