C語言指標專題 如何理解指標

2021-08-03 16:07:26 字數 2518 閱讀 4548

小魚的技術部落格,主談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程式中可怕的野指標 知乎專欄 有興趣的朋友可以看看,這裡就不多廢話了!二 越界訪問 越界訪問最常見的就是使用指標訪問陣列元素了。比如下面...