關於內存和指針操作,數據類型轉換本質的理解

 

Delphi 關於內存和指針操作,數據類型轉換的本質的理解。
很多朋友問的問題感覺都是沒有理解內存和指針與數據類型之間的關係。想解釋一下。
  很少寫東西,覺得有些東西不好表達,就想到那說到那了,希望能提供一些幫助。
指針的使用,和使用指針直接讀取數據是軟件開發中經常使用到的技術,也是軟件開發所需要掌握的基礎,理解並能靈活的使用指針來操作內存,讀寫數據是軟件開發必須要熟練掌握的基本。
內存可以看成是下圖一個個的帶顏色的小格子,每個小格子是一個字節的長度,<圖一>共顯示了8個小格式了,每個格子是一個字節,每個字節是由8bit 組成。

<圖一>
因爲我們一般操作的最小單元就是一個字節,所以展示內存佈局的時候就用<圖二>了。


 
<圖二> 圖上方的 1 2 ,3 …8 代表每個格子的地址。就象是房號一樣。
  內存的使用的是小單位是一個字節,Byte 類型和Char類型都是一個字節的長度。SizeOf(Byte)返回值是1,對計算機來說並不知道數據類型是 Byte還是Char ,它只是知道這個8個bit 的數據。
Var
  B:Byte;  
  C:Char;
Begin
  C:=’A’;  
  B:=65;
End;
這兩上類型在內存中的保存都是二進制:01000001 ,當然因爲我們能操作的最小是一個字節,即8個二進制長。01000001用十六進制表示爲: $41。@B 表示得到數據B所在的內存位置,即數據所保存的房間號。如<圖二>,@B將所返回 1 。

如果告訴你說這個字節保存的是 $41 ,你可能將它看成是 Byte 類型,也可以看成是 Char類型,這些數據類型只是人們自己爲了操作方便而起的名字罷了。
Size(Word) 返回的長度是2 ,即兩個字節。Var W:Word; 定義一個Word類型的變量,@W將返回的是第一個房間號,因爲系統知道Word 是佔用兩個字節,所以在操作時候會將兩個房間的數據來操作。如 @W返回的是 3 ,如<圖三>
 
<圖三>
則W的值是 17475 十六進制 $4443 。
 Arr1:Array[0..1] of Byte; 一個佔兩個字節的數組,它的房號是 @Arr1 或者 @Arr1[0]。
 如果 @Arr1 的值也是 3 則 Arr1[0]爲$43 Arr1[1]爲$44。
 Arr2:Array[0..1] of Char ; 也是一個佔兩個字節的數組,如果 @Arr2 的值也是 3 則 Arr2[0]爲C Arr2[1]爲D。因爲AScall碼錶中用 $43 即 67表示大字字母 C。用 $44 即 68表示大字字母 D。
以上說明,內存中保存的只是一些數字,至於這個數字是代表什麼意思,是我們自己決定的,我們定義了很多的數據類型,如 Byte;Char;Word;Integer;Array [0..1] of Byte;Array [0..1] of Char;還有更多我們自己定義的結構。如
TMyInfo= packet record
  ID:Byte;
  年齡:Byte;
  進球數:Word
End;

Var MyInfo: TMyInfo; @ MyInfo返回的地址是3 ,那ID=67,年齡=68歲,進球數=69個。
我們也可定義成如下這樣的結構。說明每個 TMyInfo2結構佔用SizeOf(TMyInfo2)=5 字節
TMyInfo2=packet record
  進球數:Word
  ID: Word;
  年齡:Byte;
End;
Var MyInfo2: TMyInfo2; @ MyInfo2返回的地址是3 ,則內存中的數據表示的意思就成了,進球數=17475($4443) ,ID= 17989個($4645),年齡=71($47)歲
以上兩個結構的內存佈局是一樣的,大小也是一樣的,只是我們對它的解釋不同,兩個結構體就象是兩個模具,對內存數據的意義根據模具的描述來確定。
上面兩個結構也可以和下面的這個結構相同
TMyInfo2=Pack record
  ID:Integer;
  年齡:Byte;
End;
就上面的內存佈局 ID =1178944579($46454443) 年齡=71($47)歲
也可以和下面的內存佈局一樣
  Var Arr3:Array [0..5] Byte; Var Arr4:Array [0..5] Char;
Arr3 [0]=67;Arr3 [1]=68;Arr3 [2]=69;Arr3]=70;Arr3 [4]=71;
  Arr4[0]=C;Arr4[1]=D;Arr4[2]=E;Arr4[3]=F;Arr4[4]=G;
   
  我們時刻要明白我們定義的數據在內存中的真實佈局情況是什麼樣子,我們對各種數據類型的轉換,指針的移動就更明確了,我們可以將一個內存塊的數據看成一個數組,也可以看成一個結構體,也可以看成是一個個的數字,在這些數據類型之間我們可以互相轉換。也可以將一個結構體複製到一個數組中。ComyMemory 進行數據的複製是不管內存中的數據是什麼業務意義的,只是將內存塊進行復制罷了。

  對內存操作,指針操作不理解的朋友都是沒有明白這些操作,沒有理解內存和數據類型的關係。理解了這些以後就可以更好的理解軟件開發的過程,更好的解釋很多的錯誤原因了。

發佈了15 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章