發表文章

目前顯示的是 十一月, 2014的文章

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 行指令的位址。

由此可知,其實在function在記憶體中也是有特定儲存的位址。
如果我們在linux的環境中使用 objdump 這個指…

C 語言 指標 學習心得

我個人用指標到現在,覺得指標的用處 : 1 . 修改外部變量 2 . 增加傳遞變數的效率 (實際上是copy位址值給 function)

學習指標的時候要注意:
1.我們要更改的變數他的type是什麼? 
2.要更改的變數他的指標的type是什麼?
心中一定要一直反問這兩句話
初學者可以理解成這樣: *****指標變數的內容是儲存位址******
*****一般變數的內容是儲存值value *****


以下我會使用 scope 的概念來幫助解說
簡單而言,以 C language 為例子,大括號之間就是一個 scope
在括號之內的東西,到最後一個括號,生命週期就結束了
像是你在  while loop 宣告int變數num 

這個 num 出了 } 之後就沒辦法再使用了
所以 function 才會有return value 去取得 function scope 裡面的值
為什麼要用指標才可以在function內改到 caller(call function的地方)變數的值?
我們可以這樣看 :

func 被 call 了時候 其實在 {} 內是這樣做
所以func結束之後n1就不見,無法在取得
所以假如我們不使用指標,而用下列的方法傳遞參數 其實是在func 內實際上先做了這樣的事情 :