2017-05-08 118 views
2

我知道這是重複的。我已經搜索過,但沒有解決我遇到的問題。 注意在試圖單出我的困惑我試圖從原來簡化類型轉換。但願它不是不確定的行爲輸入函數指針

聲明一個指向函數

Int (*funcPtr)(void*,void*); 

STRCMP聲明

int strcmp (char *, char *); 

類型轉換函數指針

FuncPtr = (int (*)(void*, void*))strcmp 

這是我弄糊塗。我明白我們已經創建了一個函數指針。因此,類型鑄造FuncPtr例如,只是改變什麼類型的功能funcPtr可以指向。我也看到,一個函數的名字是一個函數指針到自身,鑄字STRCMP,並使用從上面我的理解,

int (*)(void*, void*))strcmp 

STRCMP現在可以指向需要兩個指針作廢的功能並返回一個int,它顯然是錯誤的,就像數組我認爲函數名稱不能是指向另一個函數的指針。

因爲我的理解上面我看不出你可以用下面的類型轉換

FuncPtr = (int (*)(void*, void*))strcmp 

STRCMP的地址分配給FuncPtr作爲改變什麼函數指針STRCMP點沒有按不會改變參數和返回類型strcmp

我真的很感謝一些知識,我只是很困惑。

+3

嗯,只是因爲你可以,並不意味着這是個好主意。如果需要,我可以將我的車開到樹上,但是...... – ThingyWotsit

+1

任何函數指針都可以指向任何函數,但不允許通過指針調用該函數,除非指向的類型與函數完全匹配指向 –

+0

「我認爲函數名不能是另一個函數的指針」Eh?你什麼意思?什麼是'FuncPtr',什麼類型?請注意,C語言區分大小寫。 – Lundin

回答

4

有函數和函數指針。 strcmp是一個鏈接到您的項目的功能。當在表達式中使用標識符strcmp時,您將得到一個指向該函數的函數指針。但是你不能改變「strcmp指向哪裏」,因爲strcmp是一個函數而不是指針。

C允許在不同的函數指針類型之間進行轉換。但是,如果您嘗試通過不兼容類型的函數指針調用某個函數,則會調用未定義的行爲。

int (*funcPtr)(void*,void*); 

不與strcmp,它具有以下格式兼容:

int strcmp(const char *s1, const char *s2); 

含義:

funcPtr = (int(*)(void*, void*))strcmp; // this is ok but not very meaningful 
funcPtr(); // this is NOT ok, invokes undefined behavior 

爲了真正通過函數指針調用函數strcmp,你會必須退回到正確的類型,即int (*)(const char*, const char*)

+0

「函數名稱(標籤)被轉換爲指向自身的指針。」 http://denniskubes.com/2013/03/22/basics-of-function-pointers-in-c/最後一章討論這個 – Simple

+0

對於什麼是cast(int(*)(void * ,void *)對strcmp有影響嗎?它是否將參數類型更改爲void並將類型返回爲int – Simple

+0

@Simple它與strcmp沒有任何關係,原因與「int x = 0; char * ptr =&x;'的作用相同沒有指向'x'指針保存着一個指向物件的地址,因爲你讓一個不同類型的指針指向你的變量,這並不會改變變量本身的類型。 – Lundin