今天一天沒學習啦!我去醫院補牙了。牙壞了,有1個洞。不過我邊補牙邊在聽中山大學的匯編語言視頻教程,雖然只能聽,但是還是有點收獲的。昨天的帖子很抱歉啦,因為裡面有個叫寶石的朋友發來疑問,我當時在學其他知識,沒有仔細的看!當時我理解錯了他的意思,我在這裡向你道歉。我學的那行代碼肯定是有問題的,但是在某些寬松的場合,可以很簡潔的去表達呢!
C語言學到現在正好2周時間了,我覺得C語言還是蠻給力的。爭取在3個星期結束C語言的學習,當然這僅僅是在探索語法原理上的。也就是說至少我每寫一行代碼,我都知道它以何種形式存在於內存的哪個地方。我想呢!只有明白了這些以後才能逐步的去鍛煉C語言的內功。不過我們知道了語法原理後在遇到問題時,我們可以很快速的鎖定問題在在哪裡,因為我們知道了它的構架,我們就可以調試去尋找錯誤。
返回指針值的函數
1 返回值為指針型數據的函數,定義一般的形式為:
類型名 *函數名(參數表)
例如:int* func(int x, int y);
解釋:表示func的返回值為指向int型數據的指針。
注意點:函數名前的*只表示范圍值為指針型數據
*func兩側沒有括號。
返回指針值的函數的例子與調試呢,我就不寫了,因為我覺得這個還是非常簡單的了。我重點寫下面的知識點,指向函數的指針。
指向函數的指針
為什麼會存在指向函數的指針:因為啊!函數作為一段程序,在內存中也要占據一片存儲區域呢!它就會有一個起始地址,即函數的入口地址,這個就好像世界地圖,每個國家對就像世界地圖上的1塊空間,如果從1個固定的地方往1個方向看,每個國家都會有1個地方是離你最近的,這個最近的地方就好比函數的入口地址,也就是它的起始地址啦!這個地址我們就叫它函數的指針。
指向函數的指針有什麼作用啊:這樣一來啊,我們就可以定義一個指針變量指向函數,然後通過指針調用函數。將函數作為參數在函數間傳遞。
使用指向函數的指針會給程序帶來什麼好處啊?:我暫時還不知道,繼續往下學,說不定就知道啦!
既然函數有1個入口,那麼函數有多少個出口啊?出口就看return啦!有多少個return就有多少個出口哦!
指向函數的指針變量定義:類型名 (* 指針變量名) ();
指向函數的指針的更深入一層去理解:因為編譯器會把函數翻譯出所對於的機器代碼,那麼這個機器代碼的第一個字節的地址就是函數的 首地址,也就是指向函數的指針。
間接調用與直接調用:通過函數指針來調用函數叫間接調用,通過函數名來調用叫直接調用。
例子:
int (*p)()
表示:p是一個指向函數的指針變量,此函數的返回值為int型。
代碼事例:
大家看了這段代碼是不是發現了1個問題啊p和Max並不相等啊,這個是為什麼啊?!當然只有加油去搜尋資料了!。。。。。。10分鐘後!原來是這樣的,大家看這個:
哦!我們明白啦!在401005這裡有個jmp跳轉。原來函數指針被歸納在一個跳表裡去啦!但是這個只是在debug方式下會這樣做哦!
我們再來看一段代碼:
#include<stdio.h>int Max(int x, int y){ return x>y?x:y;}void main(){ int a; int (*p)(int) = NULL; p = (int (*)(int))Max;//其中int (*)(int)這段呢!是一個數據類型,表示一個單參函數的指針,作用是把1個 雙參函數的地址強制說成是1個單參函數的地址。 a = ((int (*)(int, int))p)(2, 9);//然後我們調用時候不行啊,因為參數不對,所以又要轉換回來!}哇!函數指針的類型轉換好郁悶啊!但是我必須要學懂!以後肯定會遇到的!
注意:由於這類指針變量等於一個函數的入口地址,所以它們做加減運算是無意義的。(嘿嘿!這句話又像譚老師!雖然我沒有看過他的書!但是我覺得呢!這些結論只是我暫時的理解!以後可能會有新的認識的!加油!!!)
邏輯與算法分離
大家看:這樣一來我們的算法和邏輯分開啦!這樣的話,我們想換算法,換參數就可以啦!我們把算法給參數化了!
這一節筆記就寫到這裡了!大家一起加油!學習知識,讓生活更美好!