C pointer to function 函式指標 學習心得
這是函式指標學習心得的第一篇,在這一篇中你會學習到: 1. 函式在記憶體中的情況 2. 如何宣告一個函式指標 3. 函式的宣告 4. 使用 typedef 來定義一個函式指標的類型 本篇著重在介紹函式指標,實際應用方面會在下一篇介紹 ------------------------ 1. 函式在記憶體中的情況 ------------------------ 在真正的開始學習函式指標 ( pointer to function ) 之前,我們要先弄懂到底什麼是函式 以及函式在記憶體分布的情形。 當一個程式碼檔案 ( .c , .cpp ...) 被執行的時候,會產生出一個程序 ( process ),此時才會開始佔用記憶體及進行各種運算。先前我們定義的指標都是針對一個資料型態,如:int * 這是一個指向 int 資料類型的指標。然而,C為什麼沒有為 function 也定義出一個資料型別? 因為不同的 function 依照建立的方式不同而有不同的 type ,所以沒辦法替每一種 function 都定義出一個通用的型別。 實際上,function 和一般的資料儲存的狀況不太一樣,他儲存的是一堆的指令。 我們可以參考下面的圖片: 圖片來源:http://ccckmit.wikidot.com/cp%3Aenvironment 當一個 process 產生的時候,會有一塊自己可以使用的記憶體,並且這個記憶體分成許多不同的區塊,儲存不同的東西。一般來說,我們使用的區域變數是儲存在 stack 區段。程式碼則是儲存在 .text 區。因此,雖然和一般的資料型式不同,但是程式碼也是會佔用記憶體的! 理所當然,他也會有自己的位址。 我們可以利用反組譯的方式來查看: 編譯方式:gcc -g -o test test.c 在這裡我使用 gdb 來輔助 第 1 行 顯示 function name 的位址,接著我們到第15行可以發現,function 第 1 行指令的位址和function name的位址是一樣的,所以我們可以得知:其實function name的位址就是function第一行指令的位址。接著,在第 8 行中,我們可以看到main呼叫函式也是利用函式第 1 行指令的位址。 由此可知,其