函式指標的強制型別轉換

2021-05-22 02:37:11 字數 884 閱讀 2029

先給出結論:函式指標是可以通過強制型別轉換而指向具有不同函式簽名的函式的,但是,轉換後,該函式指標沒辦法正確呼叫所指向的函式----不能給函式傳遞引數。

下文給出得出這個結論的小故事。

前幾天的任務要求寫乙個logger類,該類對外提供一些靜態的方法,但不生成物件。該類的主要作用是用來輸出訊息,不同的是可以由使用者選擇輸出到控制台或是磁碟檔案,當然還可以不輸出或是兩個都輸出。

我的想法是對不同的輸出,由不同的函式來執行,這樣我通過定義乙個函式指標,在使用者選擇的時候將此指標指向對應的函式。後面的話,我只要通過指標呼叫函式就可以了,而不用關心呼叫的是哪個函式。

有了這個想法後,我就著手實現各個函式。

不輸出的函式定義為: void nowrite(){},函式實現為空,所以什麼都不做,只輸出到控制台的定義為: void writetoconsole(char* msg),只輸出到檔案的定義為: void writetofile(char* msg, file* fp),同時輸出到控制台和檔案的定義為: void writeboth(char* msg, file* fp)

我以為我將要大功告成的時候突然想到乙個問題。上面的幾個函式引數列表有所不同,那麼我定義的函式指標能不能指向這個幾個函式中的任何乙個呢?我首先想到的是函式指標的強制型別轉換,然後我花了大半天的時間查詢有關函式指標型別轉換的資料。在csdn論壇上找到一篇關於函式指標轉換的帖子。作者指出,函式指標的型別是可以轉換的,我歡喜雀躍的看了帖子,但是看完了我都沒看出他的目的何在,後來乾脆放棄了型別轉換的想法,我費點事,把引數列表弄一致了。

今天早上我又一次我當初拷貝的那哥們的**,我才發現,他在**裡面只是把指標指向了不同的函式,他也同樣沒有呼叫目標函式!暈!

所以,再次告誡大家,不要再想著對函式指標做強制型別轉型了,雖然可行,但是沒意義----你根本就不能使用它。

指標強制型別轉換

當我們初始化乙個指標或給乙個指標賦值時,賦值號的左邊是乙個指標,賦值號的右邊是乙個指標表示式。在我們前面所舉的例子中,絕大多數情況下,指標的型別和指標表示式的型別是一樣的,指標所指向的型別和指標表示式所指向的型別是一樣的。例十四 1。float f 12.3 2。float fptr f 3。int...

指標型別強制轉換

問題為下 include void main 輸出為啥不是1呢 這個時候,我們可以看到函式式裡面有格式的轉換,如果格式轉換時存在除void格式外,還有兩個及兩個以上的格式的轉換,則這時候的指標所指的variable所佔的記憶體會產生變化,從而會使格式發生相應的變化 對於本題 當你強行將int指標變為...

指標變數 指標強制型別轉換

一 什麼是指標變數?指標變數,實質上是乙個變數,只是它是存放位址的變數,指標的型別代表的是它所指向的變數的型別,因此就有了指向整形 字元型 浮點型等其他型別的指標。但實際上所有型別的指標變數存放的都是int型的位址 16位的編譯系統,int是2位元組 32的編譯系統,int是4位元組 本質上,不同型...