C語言如何操作記憶體

2021-10-20 19:05:59 字數 1811 閱讀 9151

譬如在c語言中 int a; a = 5; a += 4; // a == 9;

結合記憶體來解析c語言語句的本質:

int a; // 編譯器幫我們申請了1個int型別的記憶體格仔(長度是4位元組,位址是確定的,但是只有編譯器知道,我們是不知道的,也不需要知道。),並且把符號a和這個格仔繫結。

a = 5; // 編譯器發現我們要給a賦值,就會把這個值5丟到符號a繫結的那個記憶體格仔中。

a += 4; // 編譯器發現我們要給a加值,a += 4 等效於 a = a + 4;編譯器會先把a原來的值讀出來,然後給這個值加4,再把加之後的和寫入a裡面去。

c語言中資料型別的本質含義是:表示乙個記憶體格仔的長度和解析方法。

資料型別決定長度的含義:我們乙個記憶體位址(0x30000000),本來這個位址只代表1個位元組的長度,但是實際上我們可以通過給他乙個型別(int),讓他有了長度(4),這樣這個代表記憶體位址的數字(0x30000000)就能表示從這個數字(0x30000000)開頭的連續的n(4)個位元組的記憶體格仔了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)。

資料型別決定解析方法的含義:譬如我有乙個記憶體位址(0x30000000),我們可以通過給這個記憶體位址不同的型別來指定這個記憶體單元格仔中二進位制數的解析方法。譬如我 (int)0x30000000,含義就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)這4個位元組連起來共同儲存的是乙個int型資料;那麼我(float)0x30000000,含義就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)這4個位元組連起來共同儲存的是乙個float型資料;

之前講過乙個很重要的概念:記憶體單元格仔的編址單位是位元組。

(

int*)0

;(float*)

0;(short)0

;(char)0

;int a;

// int a;時編譯器會自動給a分配乙個記憶體位址,譬如說是0x12345678

(int*)

(&a)

;// 等價於(int *)0x12345678

(float

*)a;

c語言中,函式就是一段**的封裝。函式名的實質就是這一段**的首位址。所以說函式名的本質也是乙個記憶體位址。

關於型別(不管是普通變數型別int float等,還是指標型別int * float *等),只要記住:

型別只是對後面數字或者符號(代表的是記憶體位址)所表徵的記憶體的一種長度規定和解析方法規定而已。

c語言中的指標,全名叫指標變數,指標變數其實很普通變數沒有任何區別。譬如int a和int *p其實沒有任何區別,a和p都代表乙個記憶體位址(譬如是0x20000000),但是這個記憶體位址(0x20000000)的長度和解析方法不同。a是int型所以a的長度是4位元組,解析方法是按照int的規定來的;p是int *型別,所以長度是4位元組,解析方法是int *的規定來的(0x20000000開頭的連續4位元組中儲存了1個位址,這個位址所代表的記憶體單元中存放的是乙個int型別的數)。

陣列管理記憶體和變數其實沒有本質區別,只是符號的解析方法不同。(普通變數、陣列、指標變數其實都沒有本質差別,都是對記憶體位址的解析,只是解析方法不一樣)。

int a; // 編譯器分配4位元組長度給a,並且把首位址和符號a繫結起來。

int b[10]; // 編譯器分配40個位元組長度給b,並且把首元素首位址和符號b繫結起來。

陣列中第乙個元素(a[0])就稱為首元素;每乙個元素型別都是int,所以長度都是4,其中第乙個位元組的位址就稱為首位址;首元素a[0]的首位址就稱為首元素首位址。

C語言如何操作記憶體

比如在c語言正 int a a 5 a 4 a 9 結合記憶體來解釋c語言語句的本質 int a 5 編譯器幫我們申請了乙個int型別的記憶體格仔 長度是4位元組,位址是確定的,但是只有編譯器知道,我們是不知道的,也不需要知道 並且把符號a和這個格仔繫結。a 5 編譯器發現我們要給a賦值,就會把這個...

C語言如何操作記憶體

c語言對記憶體位址的封裝 資料型別的本質含義 表示乙個記憶體格仔的長度和解析方法。關於型別,不管是普通變數型別 int,float等 還是指標型別 int float 等 只需要記住 型別只是對後面的數字或者符號 符號代表記憶體位址 的長度規定和解析方式規定而已。c語言中的指標全稱為指標變數,指標變...

C語言如何操作記憶體

1 用變數名來訪問記憶體 c語言對記憶體位址的封裝 資料型別 函式名 直接訪問記憶體 使用位址 資料型別 表示乙個記憶體格仔的長度和解析方法。記憶體編址的單位是乙個位元組 float 0 0的位址存的是指標,指標指向乙個float型別的數 short 0 0位址是short型別的變數,存的是shor...