小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈:我的csdn技術部落格
最近在研讀c primer plus 5版中文版,老外寫的,還是很經典的,推薦給讀者們,有需要的朋友可以在這裡購買:c primer plus 5版中文版
指標,傳說中是c語言中的乙個難點,且是難點中的難點。本文在教材的基礎上,再詳細地談談「指標」這個東東,力爭讓大家能理解它。
一、指標的概念
關於指標的定義,很多教材一般給出「它是乙個位址」,「儲存的是變數的位址」,「指向了乙個值」等等描述。這樣描述其實也沒錯,但是就是不那麼好理解。我覺得要理解指標,無需給出什麼定義,只需講透如下5個點,我認為基本就可以理解乙個指標了。這5個點我總結如下:
1. 指標是乙個普通的變數;
2. 既然指標是變數,那麼肯定有自己的型別;
3. 既然指標是變數,那麼肯定有自己的值;
4. 只不過指標的值跟一般變數的值不太一樣,指標的值是乙個「位址」。
5. 指標指向的資料
為了講透這5個點,下面列舉一段**,如下。
二、**來說明
請欣賞以下**
#include #include int main(void)
return 0;
}
執行結果是:
三、下面結合**我來談談那5個點:
1. 指標是乙個普通的變數
本例中,有乙個字元變數「c」,它的值是string[0],也就是「s」,這個大家都很好理解。
還有乙個指標「pointer」,注意,它也是乙個變數,和字元「c」一樣,就是乙個普通的變數而已,它也有乙個值,它的值是「&string[0]」,從執行結果來看,就是「0022fed9」,這是乙個16進製制的數。
2. 指標自己的型別
本例中,字元變數「c」的型別是「char」,陣列string的型別也是「char」,那麼指標「pointer」的型別也是「char」。不過與c和string的型別char相比,pointer型別的char卻有一點小區別。
變數c的型別char說明了c的值「s」是乙個字元資料,陣列string的型別char說明了其每乙個陣列元素也是字元資料,但是指標pointer的型別char是不是也說明「0022fed9」是乙個字元資料呢?傻子都知道當然不是啦!那麼pointer的char型別到底是在說誰呢?這就是指標的乙個詭異的地方。等講完第5點指標指向的資料你就知道了。
3. 指標自己的值
上面已經說了,指標既然也是乙個變數,那麼肯定有自己的值,在本例中,指標自己的值就是「0022fed9」,是乙個16進製制的數,這個值哪來的?是「&string[0]」賦予給指標的。
「0022fed9」這個東東也是很多教材中提到的「位址」。很多人會想,你告訴我「0022fed9」是乙個值我還好理解,你告訴我它還是乙個什麼位址,這就讓人暈菜了,下面第4點就來說說這個「0022fed9」。
4. 指標的值
不知大家發現沒有,在c程式中,如果定義了int,char等變數,那麼在**中很多地方都會用到這些變數的值。比如在本例中,定義了陣列string,則接下來的**就用到了陣列的元素,也就是printf函式輸出來。如果定義了乙個指標變數,可能大家很少看到在**中會用到指標的值,比如在本例中,大家就沒有看到用到「0022fed9」。
確實,相比一般型別變數的值被頻繁使用而言,指標的值很少會被直接用到。注意,這裡說的很少被直接用到,是指寫**的人,也就是程式猿會很少用到,但有乙個角色用指標的值用的非常多,就是作業系統。
比如在本例中,輸出陣列的每乙個元素時,我表面上是用的*(pointer + index)來輸出的,其實在背後,作業系統在執行這個語句時,都是利用指標的值「0022fed9」來找到陣列的每乙個元素的,所以程式最終能正確輸出陣列的每乙個字元。
上面也說了,「0022fed9」是被系統用的最多,為啥被系統用的最多呢?因為「0022fed9」是乙個位址,是string陣列的第乙個元素「s」的位址。說的再通俗一點,字元「s」放在乙個大小為1byte的記憶體塊裡,這個記憶體塊的位址就是「0022fed9」。
5. 指標指向的資料
在第4點說到,字元「s」放在乙個大小為1byte的記憶體塊裡,這個記憶體塊的位址就是「0022fed9」,那麼,我們就說,指標「pointer」的值是「0022fed9」,在位址為「0022fed9」的地方放了乙個字元「s」,這個「s」就是指標「pointer」指向的資料,且通過「*pointer」這種寫法來獲取「s」,從某種意義上來說:
pointer 等於 0022fed9;
*pointer等於「s」,加上*號,就是直搗黃龍,拿到「s」。
此時我們可以說說第2點中提到的指標的型別是來修飾誰的問題了。在本例中,pointer的型別char顯然不是來修飾「0022fed9」的,它是來告訴作業系統,我pointer認為「0022fed9」這個地方存放的是字元,是字元,是字元,且佔1個byte的大小。
如果pointer的型別改為int,我pointer就認為「0022fed9」這個地方存放的是整數,是整數,是整數字元,且佔4個byte的大小。
C語言指標專題 序
小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈 我的csdn技術部落格 看到好多的c語言初學者學到指標時,都覺得指標怎麼那麼難啊!我也想起了我當時學習指標時遇到的困難,確實很難!到底是教程寫的不好呢,還是老師教的不好呢?我覺得都有。網上搜尋指標講解的資料很多,我也看了不少,不...
C語言 指標理解
剛剛程式設計遇到了乙個問題,如下 include struct nodetree 101 int loc node creat bool build node t,char c return true intmain return0 預期結果,我本來想達到一種效果,就是將t傳進去,然後對t做修改,返...
C語言指標專題 使用指標要注意這些
c語言中,指標的概念有點難懂,使用起來稍微不注意,也會遇到各種問題。在本文中,我列舉出了幾個使用指標不當的方式,希望朋友們在程式設計實踐中也多多注意。一 野指標 c程式中可怕的野指標 知乎專欄 有興趣的朋友可以看看,這裡就不多廢話了!二 越界訪問 越界訪問最常見的就是使用指標訪問陣列元素了。比如下面...