學習筆記:對C語言指標的理解
在C語言中,有很多極易混淆的概念(比如:記憶體和指標、函式指標、指標函式、陣列指標、指標陣列),也正是這些概念使得很多人學習起來很累,今天,筆者分享一下自己對這些的概念的理解。
一、定義
1、記憶體:隨機存取儲存器,也叫主存,是與CPU直接交換資料的內部儲存器。
2、指標:是程式語言中的一類資料型別及其物件或變數,用來表示一個存取器地址,這個地址的值直接指向存在該地址物件的值。
3、函式指標:是一種在C、C++(類C語言)中指標,可以像一般的函式一樣傳參、呼叫、返回變數。
4、指標函式:返回值是一個指標的函式稱為指標函式。
5、陣列指標:當陣列名作為取地址&運算子的運算元,則表示式的值為指向整個陣列的指標
6、指標陣列:一個數組,陣列中的各個元素都是指標。
二、理解
關鍵:程式碼中一切都是資料,而資料只有兩個屬性:首地址和長度,至於怎麼讀取這個資料與資料本身無關。
如果你理解了上面這一句話,那麼C語言中很多看似複雜的概念就很好理解了,那麼接下來,我們來看下面這幾句古文。
① 下雨天留客天留我不留
這句話可以拆解成很多總句式:最常見的就是“下雨天,留客天,留我不?留!”,“下雨天留客,天留我不留。”。
② 黃河遠上白雲一片孤城萬仞山羌笛何須怨楊柳春風不度玉門關
上面這一段古文是一段千古佳話,傳聞紀曉嵐為人畫扇,寫下了上面這一段文字,要知道當時是沒有標點符號的
黃河遠上白雲間,一片孤城萬仞山。
羌笛何須怨楊柳,春風不度玉門關。
這個問題也是立馬就被紀曉嵐的朋友發現了,當即指了出來,紀曉嵐心想,這回可是糗大了,但是細細一看,紀曉嵐靈機一動,立馬把這個尷尬的詞給圓了過去:
黃河遠上,白雲一片,孤城萬仞山。
羌笛何須怨,楊柳春風,不度玉門關。
古代漢語沒有標點符號,寫在紙上,就如同資料(0和1)儲存在記憶體中,從上面我們可以知道:同一段記憶體空間,我們不同的讀法,讀取到的結果是不一樣的,按照王之渙《涼州詞》的讀法,紀曉嵐很明顯就是錯的,如果按照紀曉嵐的那個讀法,又是合情合理,也符合斷句,也是朗朗上口。再者就是都是從“下”字(首地址
一:資料 = 首地址 + 長度
二:所有的資料型別本質上就兩種:單位元組資料、多位元組資料。
從這個角度去從新理解上面的定義:
1、記憶體:一個或者一組容器,能夠存取資料的容器。
2、指標:一個首地址。
3、函式指標: 一個首地址。
4、指標函式:返回 首地址 的函式。
5、陣列指標:一個首地址
6、指標陣列:一個數組,陣列中的各個元素都是首地址。
這樣一來,你會發現上面的很多定義都成了首地址,既然都是首地址,那麼那麼他們的區別就是長度和讀取方式的不同了。
這裡需要面對一個不可逃避的問題:首地址也是一個數據。
相信很多人,又會開始疑惑了,如果首地址也是一個數據,資料又只是首地址和長度......,那這豈不是成了無底洞?
我的答案是,不是這樣的,記憶體中每一個位元組都有自己的唯一的地址,地址是唯一的,不過從某個地址上開始儲存多少個位元組的資料,這個資料是可變的,既然是可以變動的,那麼自然也是可以吧另一個地址的值存到這裡來。