看透指針

看透指針

來自專欄舍予書

Hello 今天分享的是我對C/C++指針方面的理解,好了廢話少說我們進入正題。

我是這樣看待指針的

C/C++的指針是被其它語言所詬病的,因為管理指針是一個很麻煩的事情。但是C/C++的優勢體現也是在指針上,因為通過訪問指針,程序可以直接操作內存,沒錯直接操作,只要你願意按位都可以。

我是這樣理解指針

在初學C++的時候,網上都說指針多麼的難理解。但也許是我之前學過一點彙編,從而我感覺指針並沒有傳說中的那麼難。在我眼裡,內存就是一個bit一個bit的格子(你也可以認為是房子)。 當然這樣的格子是非常非常的多的,於是便需要一系列連續的編號(門牌號)對其管理,而這個編號也就是內存中的地址。

當我們向系統申請內存時,系統會為我們開闢一段連續的空閑內存,並給我們這段內存中第一個格子的編號。 你也可以這樣理解:當你需要住房時,調度員會給你房子的入口門牌號,而房子的多少取決於你需要多大的空間。

當我們對指針做加一減一的時候,指針會指向下一個或上一個內存塊的第一個編號。而這裡的內存塊是由多個連續的bit格子組成,而組成這個塊的bit格子的數量,是由指針的類型決定。

比如 char 是一個位元組,而一個位元組又是8個比特,而對於char類型的指針,每做加一的時候就是將指針向後移動8個bit格子。

二級指針

顧名思義二級指針便是指向指針的指針。也許對於初學者一時可能想不明白,那麼讓我為你細細道來。

當我們和系統獲取內存時,系統會返回給我們指向該段內存首地址。而我們需要將該地址存儲到一個變數中。如下:

int *ptr = new int;

在上面的代碼中, 變數 ptr 中便是一個指針,存儲了指向一段長度為4個位元組(在32位操作系統下)的內存首地址。而對於二級指針便是指向 ptr 的指針。

int **secondptr = &ptr;

其實,上面代碼中 int *ptr 也是一段內存,而這段內存為int類型的指針,在C/C++中所有指針的長度都為4個位元組(64為操作系統為8個位元組)。而二級指針便是指向ptr這段內存的首地址。

對於指針的操作,是操作內存中的數據,而對二級指針操作則是在操作指針(其實也是在操作內存中的數據,只不過數據是指針)。

哪裡可以用的到指針

這裡我向大家分享一下自己對內存的使用。如果你有更高的使用場景,歡迎在下面的評論區提出。

  1. *對於頻繁而又大量的數據移動*:在實際開發中常常會遇到頻繁的數據拷貝,而如果直接拷貝數據會降低程序的效率。而如果是指針拷貝,則永遠都是移動4個位元組(在64位系統是8位元組)。
  2. *對於返回參數*: 當函數需要通過參數來返回數據時,我們可以使用指針(當然在C++中使用引用最好)。而當需要返回一個指針時,我們需要的是二級指針。

當然,這只是簡單的使用,更多的技巧大家可以看下面推薦的書籍,這裡就不贅述了。

關於指針的書籍推薦

在上一篇文章 如何快速學習 C/C++ 語法 中提到的 《C++ Prime》 一書便有對指針有講解。不過在這裡還有一本不錯的書籍推薦給你 《C和指針》。 這本書籍詳細的講解了C指針的使用, 包括二級指針、函數指針以及使用指針的一些技巧。

我在使用指針中遇到的坑

內存越界

對於越界,其實就是訪問了自己不該訪問的內存,這樣的行為後果是不可預期的。

而對於內存越界問題,只能在編程中對邏輯的把控。尤其是當使用循環操作內存時要尤為小心,要時刻注意所操作內存的長度,和每次操作的位置。

內存泄漏

我想內存泄漏對於程序員來說就是噩夢,至少對我來說是這樣。內存泄漏就是我們獲取了內存但卻沒有釋放,我出現這樣的錯誤主要是在異常退出的情況下忘記釋放內存。 例如:函數中間發生異常而退出時… 循環中的break、continue;

至於避免方法,我只能說祝你好運了….

哈哈,開玩笑的。這裡向你推薦一個Linux下檢測內存泄漏的軟體: VALGRIND 檢查內存泄漏方法,這個軟體可以檢測出大部分的內存泄漏問題,期望能夠幫助到你。

這裡還有一個下下策獻上:定時重啟…(小編此時一臉壞笑)

最後

如果你發現任何問題或疑問,你可以在下面留言或者通過 微博 和郵箱聯繫我,我會第一時間給予答覆。 本文出自 舍予書,如需轉載請保留該段聲明,非常感謝。


推薦閱讀:

最高效的學習方法——逆向學習法
用python搞定excel文件:xlrd、xlwt模塊
「崩潰」,也許是另一種形式的饋贈
開始更新嘍
C語言入門 第一課 第一個程序

TAG:指針CC | 編程 | 自學編程 |