1. 程式人生 > >學習筆記:對C語言指標的理解

學習筆記:對C語言指標的理解

在C語言中,有很多極易混淆的概念(比如:記憶體和指標、函式指標、指標函式、陣列指標、指標陣列),也正是這些概念使得很多人學習起來很累,今天,筆者分享一下自己對這些的概念的理解。

一、定義

1、記憶體:隨機存取儲存器,也叫主存,是與CPU直接交換資料的內部儲存器。

2、指標:是程式語言中的一類資料型別及其物件或變數,用來表示一個存取器地址,這個地址的值直接指向存在該地址物件的值。

3、函式指標:是一種在C、C++(類C語言)中指標,可以像一般的函式一樣傳參、呼叫、返回變數。

4、指標函式:返回值是一個指標的函式稱為指標函式。

5、陣列指標:當陣列名作為取地址&運算子的運算元,則表示式的值為指向整個陣列的指標

6、指標陣列:一個數組,陣列中的各個元素都是指標。

二、理解

關鍵:程式碼中一切都是資料,而資料只有兩個屬性:首地址和長度,至於怎麼讀取這個資料與資料本身無關。

如果你理解了上面這一句話,那麼C語言中很多看似複雜的概念就很好理解了,那麼接下來,我們來看下面這幾句古文。

① 下雨天留客天留我不留

     這句話可以拆解成很多總句式:最常見的就是“下雨天,留客天,留我不?留!”,“下雨天留客,天留我不留。”。

② 黃河遠上白雲一片孤城萬仞山羌笛何須怨楊柳春風不度玉門關

     上面這一段古文是一段千古佳話,傳聞紀曉嵐為人畫扇,寫下了上面這一段文字,要知道當時是沒有標點符號的

,所以紀曉嵐也是寫得一手大板書,細心的朋友可能已經發現了,如果紀曉嵐寫得是王之渙的《涼州詞》,那麼他少些了一個“間”字,王之渙的《涼州詞》原文是:

黃河遠上白雲間,一片孤城萬仞山。

羌笛何須怨楊柳,春風不度玉門關。

這個問題也是立馬就被紀曉嵐的朋友發現了,當即指了出來,紀曉嵐心想,這回可是糗大了,但是細細一看,紀曉嵐靈機一動,立馬把這個尷尬的詞給圓了過去:

黃河遠上,白雲一片,孤城萬仞山。

羌笛何須怨,楊柳春風,不度玉門關。

古代漢語沒有標點符號,寫在紙上,就如同資料(0和1)儲存在記憶體中,從上面我們可以知道:同一段記憶體空間,我們不同的讀法,讀取到的結果是不一樣的,按照王之渙《涼州詞》的讀法,紀曉嵐很明顯就是錯的,如果按照紀曉嵐的那個讀法,又是合情合理,也符合斷句,也是朗朗上口。再者就是都是從“下”字(首地址

)開始讀,一次讀取三個字是“下雨天”,一次讀取五個字就是“下雨天留客”。如果把“下”字(首地址)比作記憶體地址(0xA12D1000)呢?你又能有什麼體會?

一:資料 = 首地址 + 長度

二:所有的資料型別本質上就兩種:單位元組資料、多位元組資料。

從這個角度去從新理解上面的定義:

1、記憶體:一個或者一組容器,能夠存取資料的容器。

2、指標:一個首地址。

3、函式指標:  一個首地址。

4、指標函式:返回  首地址 的函式。

5、陣列指標:一個首地址

6、指標陣列:一個數組,陣列中的各個元素都是首地址。

這樣一來,你會發現上面的很多定義都成了首地址,既然都是首地址,那麼那麼他們的區別就是長度讀取方式的不同了。

這裡需要面對一個不可逃避的問題:首地址也是一個數據。

相信很多人,又會開始疑惑了,如果首地址也是一個數據,資料又只是首地址和長度......,那這豈不是成了無底洞?

我的答案是,不是這樣的,記憶體中每一個位元組都有自己的唯一的地址,地址是唯一的,不過從某個地址上開始儲存多少個位元組的資料,這個資料是可變的,既然是可以變動的,那麼自然也是可以吧另一個地址的值存到這裡來。