函數指標小記

來源:互聯網
上載者:User

 在此之前,我先簡要說一下程式在記憶體中的分配問題。在一個程式運行時,我們可以簡單的吧記憶體分為四個部分:代碼區(Code Area),全域資料區(Data Area),堆區(Heap Area),和棧區(Stack Area)。其中程式運行時對資料的處理放在代碼區,定義的普通變數放在棧區,全域變數和靜態變數(包括全域和局部)放在全域資料區,堆區用來存放動態資料(主要由new,malloc等函數定義)。

        有了這些基本知識,現在可以開始講解了。其實說白了,函數名表示的就時一個地址,如果你很熟悉數組的話,就會很好理解,函數名同數組名一樣,都起著一個標號的作用,既然是標號,就具有地址的屬性。因此,我們在以後學習函數中遇到不理解的地方大可以與數組名的概念比較一下。但是它們之間還時有些不同的地方。如數組前的類型名如:int ,char等,實際上時告訴程式在對數組的存取中以多少個記憶體單元為單位一起處理。舉個例子:在16位機上,以個整型變數佔2個位元組,程式在對這個變數進行操作時就兩個兩個位元組的取值。而函數前的類型名表示函數的傳回值,它的賦值實際上時由return語句決定的,注意這裡我們用的時*賦值*,而不是什麼傳遞,因為局部變數的存留時間在函數的“}”結束時就結束了,所返回的值實際上時臨時開闢的記憶體空間(全域變數除外),因此我們不能把指標指向它,這樣做是很危險的,因為臨時資料的不知道什麼時候就會被其他資料覆蓋掉,如果後來對指標的操作破壞了棧區的一些重要資料,如其他調用函數的返回地址,就有可能造成程式的崩潰。

關於函數指標,可以簡單的表示為:int (* fun) (char a,char b,……);,如果我們用typedef語句對它進行定義的話,如:typedef int (*fun) (char a,char b,……);他表示一個指向傳回值為int,有形如char a,char b參數的函數,我們可以用它來定義一個類型的指標,fun ptr1,ptr2;他們都有著與fun一樣的屬性,其實這很好理解,我們只要把函數之戰看成簡單的諸如:int之類的變數就行了,同樣的我們也可以把它作為返回參數如我們已有這樣的定義:typedef int(* FUN)();   那麼返回函數指標的函數運算式就應該形如: FUN fun(int ,char);定義為函數的傳回值,返回是函數指標。

這時我們若把FUN與int類比一下就會很好理解了。我之所以總是強調類比,因為在程式學習中類比時個非常重要的學習方法,可以充分的舉一反三,讓你的學習變的非常輕鬆。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.