走出 函數指針/指針函數 的混淆世界

相信很多小夥伴跟我一樣,曾經或是現在被函數指針/指針函數 這兩個名字搞得頭昏腦脹,並且總是傻傻分不清楚,即使是之前某個時候通過百度/Google到的文章搞清楚過,過了一段時間後,又搞忘了。如果您有這樣的困擾,那麼可以好好看看我這篇文章,或許能將您帶出混淆的誤區。

指針

要搞清楚這幾個混淆誤區之前,就不得不搞清楚的就是指針這個玩意兒(ps. 這裏主要還是以C/C++語言來對這些個東西進行講解,畢竟這些個東西在這兩門語言中是家常便飯)。

通俗理解指針

我這人寫技術文章一直秉持一種想法,就是以自己覺得最通俗易懂的方式將東西寫清楚,因此我在此對指針的講解也是以一種通俗的方式。

我們知道,聲明一個變量

int a = 10;

最終的內存佈局是這樣的

a變量對應着的地址處0x100100存儲着10這個數值。

對於指針變量

int a = 10;

int *b = &a;

最終的內存佈局就是這樣的

從圖中可以看出來,其實指針變量b就是和a是個一樣的變量而已,只是a的內存地址裏存儲的直接就是10這個數值,而在變量b的內存地址中存儲是一個地址,通過存儲着的這個內存地址就可以找存儲的那個數值10,也就是我們常說的變量b指向了a的地址。

在我看來,指針就是這麼簡單,指針變量其實並沒什麼多大的不一樣,指針仍然是和普通變量一樣,都是存儲着一個值的地址空間而已,只不過普通變量存儲着的是具體的那個值,指針變量存儲着的是一個地址而已,只是要通過存儲着的那個地址值才能找到最終的那個值而已。就是這麼簡單,只是可能編程語言本身給指針的讀和寫設置了很多語法糖。

函數指針/指針函數

函數指針和指針函數   其實也同樣的很簡單很容易理解,就是看你理解的方式了。正如我在文中標記的一樣,您會發現我將兩個地方加粗了。對,這就是重點,無論是 函數指針/指針函數,還是數組指針/指針數組,只要找到重點就行,這裏的重點就是我標註加粗的地方,也就是後面的兩個字纔是重點。

函數指針 的重點是指針,也就是說,它是個指針,看下面代碼

//定義實現一個sum函數

int sum(int a, int b) {

        return a + b;

}

int main() {

        //定義一個函數指針指向sum函數的地址

        int (*varSumFunc)(int a, int b) = sum;

        return 0;

}

這裏的varSumFunc其實就跟前面的int *b一樣的,就是一個指針變量,只是這個指針變量指向的是一個函數地址而已,爲何是這樣子定義一個函數指針,沒有原因,就是語法而已,並且這樣子定義可以跟指針函數進行區分。

 

指針函數的重點就是函數,它是一個函數,只是它返回的值是一個指針類型的變量而已,如以下代碼

int *test() {

        int a = 10;

        int *b = &a;

        return b;

}

 

int main(){

        int *t = test();

        return 0;

}

通過上面的代碼,相信你一定一目瞭然了吧,所謂的指針函數 就只是一個返回了一個變量的函數而已。

就是這麼簡單,容易搞混的主要是由於這兩個詞太想近了,其實只要你明白了這個東西的重點在哪兒,無論你何時想起這兩個東東,你都是明瞭於心的,對吧!!!

發佈了15 篇原創文章 · 獲贊 18 · 訪問量 5673
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章