關於記憶體和指標操作,資料型別轉換本質的理解

2021-08-26 04:51:16 字數 2530 閱讀 7594

delphi 關於記憶體和指標操作,資料型別轉換的本質的理解。

很多朋友問的問題感覺都是沒有理解記憶體和指標與資料型別之間的關係。想解釋一下。

很少寫東西,覺得有些東西不好表達,就想到那說到那了,希望能提供一些幫助。

指標的使用,和使用指標直接讀取資料是軟體開發中經常使用到的技術,也是軟體開發所需要掌握的基礎,理解並能靈活的使用指標來操作記憶體,讀寫資料是軟體開發必須要熟練掌握的基本。

記憶體可以看成是下圖乙個個的帶顏色的小格仔,每個小格仔是乙個位元組的長度,《圖一》共顯示了8個小格式了,每個格仔是乙個位元組,每個位元組是由8bit 組成。

《圖一》

因為我們一般操作的最小單元就是乙個位元組,所以展示記憶體布局的時候就用《圖二》了。

《圖二》 圖上方的 1 2 ,3 …8 代表每個格仔的位址。就象是房號一樣。

記憶體的使用的是小單位是乙個位元組,byte 型別和char型別都是乙個位元組的長度。sizeof(byte)返回值是1,對計算機來說並不知道資料型別是 byte還是char ,它只是知道這個8個bit 的資料。

varb: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 進行資料的複製是不管記憶體中的資料是什麼業務意義的,只是將記憶體塊進行複製罷了。

對記憶體操作,指標操作不理解的朋友都是沒有明白這些操作,沒有理解記憶體和資料型別的關係。理解了這些以後就可以更好的理解軟體開發的過程,更好的解釋很多的錯誤原因了。

8 表操作 資料型別

儲存引擎決定了表的型別,而表內存放的資料也要有不同的型別,每種資料型別都有自己的寬度,但寬度是可選的 詳細參考 mysql常用資料型別概覽 1.數字 整型 tinyinit int bigint 小數 float 在位數比較短的情況下不精準 double 在位數比較長的情況下不精準 0.000001...

表操作 資料型別簡介

儲存引擎決定了表的型別,而表內存放的資料也要有不同的型別,每種資料型別都有自己的寬度,但寬度是可選的。詳細可參考 mysql常用資料型別概覽 1.數字 整型 tinyinit int bigint 小數 float 在位數比較短的情況下不精準 double 在位數比較長的情況下不精準 0.00000...

python的常用資料型別操作 數值

一 數值 1.表現形式 1.1整數 int 1.1.1二進位制 0b 二進位制數,只包含0和1 1.1.2八進位制 0或者0o 八進位制數,只包含0 7 1.1.3十進位制 只包含0 9 1.1.4十六進製制 0x 十六進製制數,0 9和a f。案例 二進位制 num 0b101010 print ...