ABCDEFGHIJKLMNOPRSTUVWXYZAAABACADAEAFAGAHAIAJAK
1
----------------------------使用說明--------------------------------------------------------------------------------
Booker製作
2
一、為方便顯示,記憶體從右到左,從上至下排列,以符合數字呈現
記憶體視覺化V1.3
3
二、以64位元電腦為例。
更新日期:2021/3/27
4
三、1個位元Byte = 8bits(下面顯示的一排記憶體剛好等於一個Byte)
5
四、int = 4Bytes = 32bits
6
五、記憶體分配不可能都剛好給你整數的位置,以下範例純粹是方便示範,所以記憶體位置都是0或8結尾。
7
六、看到空格就自己補0吧
8
-------------------------------------------------------------------------------------------------------------------------
9
取址
或指標
指標代表的記憶體位置變數16進位表示00假定最右側記憶體位置
(16進位)
sizeof(變數)
10
這個記憶體位置為0x0000 6e23 0075 0000------>
0x0000 6e23 0075 0000
11
0x0000 6e23 0075 0001
12
2進位寫法等同於ff111111110x0000 6e23 0075 0002
13
16進位寫法ff0x0000 6e23 0075 0003
14
0x0000 6e23 0075 0004
15
2進位寫法等同於3d001111010x0000 6e23 0075 0005
16
16進位寫法3d0x0000 6e23 0075 0006
17
一、首先宣告兩個變數
{
int a = 5;
int b = 65535;
}
0x0000 6e23 0075 0007
18
1110x0000 6e23 0075 0008
19
對a做取址得到記憶體第一個位置,因為point是8byte(32bits)的資料,會直接將所有資料讀出↓↓↓11110x0000 6e23 0075 0009
20
110x0000 6e23 0075 000A
21
0x0000 6e23 0075 000B
22
&a =0x0000 6e23 0075 000Ca0f000011100x0000 6e23 0075 000C4
23
00000000000x0000 6e23 0075 000D
24
00000000000x0000 6e23 0075 000E
25
00000000000x0000 6e23 0075 000F
26
&b =0x0000 6e23 0075 0010bff111111110x0000 6e23 0075 00104
27
ff111111110x0000 6e23 0075 0011
28
00000000000x0000 6e23 0075 0012
29
00000000000x0000 6e23 0075 0013
30
10x0000 6e23 0075 0014
31
110x0000 6e23 0075 0015
32
10x0000 6e23 0075 0016
33
二、接著宣告一個陣列

int arr[3] = [1, 70000, 2*10^8];
0x0000 6e23 0075 0017
34
10x0000 6e23 0075 0018
35
arr = &arr = &arr[0] =
10x0000 6e23 0075 0019
36
0x0000 6e23 0075 001Barr[0]
*arr
0110x0000 6e23 0075 001A4
37
000x0000 6e23 0075 001B
38
000x0000 6e23 0075 001C
39
000x0000 6e23 0075 001D
40
&arr[1] =0x0000 6e23 0075 001Farr[1]
*(arr+1)
70011100000x0000 6e23 0075 001E4
41
11000100010x0000 6e23 0075 001F
42
000x0000 6e23 0075 0020
43
000x0000 6e23 0075 0021
44
&arr[2] =0x0000 6e23 0075 0023arr[2]
*(arr+2)
00000000000x0000 6e23 0075 00224
45
C2110000100x0000 6e23 0075 0023
46
EB111000000x0000 6e23 0075 0024
47
0B10110x0000 6e23 0075 0025
48
0x0000 6e23 0075 0026
49
110x0000 6e23 0075 0027
50
三、接著宣告一個字元字串
char TEXT = “Hi”;
0x0000 6e23 0075 0028
51
1110x0000 6e23 0075 0029
52
110x0000 6e23 0075 002A
53
字元10進位16進位0x0000 6e23 0075 002B
54
&TEXT =0x0000 6e23 0075 002CTEXT[0]H7248010010000x0000 6e23 0075 002C3
55
TEXT[1]i10869011010010x0000 6e23 0075 002D
56
TEXT[2]\000000000000x0000 6e23 0075 002E
57
10x0000 6e23 0075 002F
58
往右邊(T欄位)看電腦實際跑出來的結果做驗證0x0000 6e23 0075 0030
59
110x0000 6e23 0075 0031
60
10x0000 6e23 0075 0032
61
0x0000 6e23 0075 0033
62
可能會有未被清0的記憶體--->
11110x0000 6e23 0075 0034
63
11110x0000 6e23 0075 0035
64
1110x0000 6e23 0075 0036
65
111110x0000 6e23 0075 0037
66
1110x0000 6e23 0075 0038
67
0x0000 6e23 0075 0039
68
110x0000 6e23 0075 003A
69
10x0000 6e23 0075 003B
70
四、宣告指標
{
//int *指的是宣告型態為int的指標
int x = 5;
int *ptr = &x;
}
0x0000 6e23 0075 003C
71
0x0000 6e23 0075 003D
72
0x0000 6e23 0075 003E
73
&ptr =0x0000 6e23 0075 003Fptr0x0000 6e23 0075 004A400x0000 6e23 0075 003F8
74
000x0000 6e23 0075 0040
75
sizeof(ptr) =8 Bytes = 32bits750x0000 6e23 0075 0041
76
000x0000 6e23 0075 0042
77
230x0000 6e23 0075 0043
78
6e0x0000 6e23 0075 0044
79
000x0000 6e23 0075 0045
80
000x0000 6e23 0075 0046
81
ptr = &x0x0000 6e23 0075 0047x0f000011100x0000 6e23 0075 00474
82
00000000000x0000 6e23 0075 0048
83
sizeof(x) =4 Bytes = 16bits00000000000x0000 6e23 0075 0049
84
00000000000x0000 6e23 0075 004A
85
0x0000 6e23 0075 004B
86
10x0000 6e23 0075 004C
87
10x0000 6e23 0075 004D
88
0x0000 6e23 0075 004E
89
這邊如果再宣告一個指標的指標
int **pptr = &ptr = &(&ptr)
0x0000 6e23 0075 004F
90
0x0000 6e23 0075 0050
91
pptr = &ptr =0x0000 6e23 0075 0051ptr_ptr0x0000 6e23 0075 005D510x0000 6e23 0075 0051也可以用*ptr的方式指向目標,來讀取資料,不過這邊就僅展示不多加說明
92
000x0000 6e23 0075 0052
93
sizeof(ptr_ptr) =
8 Bytes = 32bits750x0000 6e23 0075 0053
94
指標在64位元的記憶體,一定是8Bytes000x0000 6e23 0075 0054
95
230x0000 6e23 0075 0055
96
6e0x0000 6e23 0075 0056
97
000x0000 6e23 0075 0057
98
000x0000 6e23 0075 0058
99
0x0000 6e23 0075 0059
100
五、宣告一個陣列指標
{
int *array = calloc(3, sizeof(int));

array[0] = 5;
array[1] = -1;
array[2] = -5;
}
0x0000 6e23 0075 005A