發表文章

目前顯示的是 11月, 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 行指令的位址。 由此可知,其

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 內實際上先做了這樣的事情 : 可是假如我們改成 傳入變數的位置 (指標變數的內容是 指到的變數 的 位址 ) fun內: 藉由這個方法 我們才可以真正存取到外面的變數 ( 因為知道 複製 外面變數的位址給 num ) ex : 0x12345678 之類 否則只是在自己scope ( 中文叫做作用域 ) 操作 所以才會有指標這種東西。由此可見,指標有一種功能:更改外部變數內容 指標另一個功能是方便傳遞變數 —————————- —————————- —————————-  小結  —————————- —————————- —————————-   利用 func 更改 main 中 int type 的變數  //這裡的int *整個是一個 type