在彙編的角度來理解C語言3級指標

2021-08-21 07:29:36 字數 1460 閱讀 5985

c語言中指標使用頻率是很高的,我們知道指標乙個特殊的變數,它的值是指向一塊記憶體位址

我寫了乙個簡單的c**

void test1()

編譯,然後ollydbg載入

我們一句句來

mov dword ptr ss:[ebp-0xc],0x0 

將值0 放入棧空間位址  ss:[ebp-0xc]  實體地址為  00d3fbdc 

對應c**    int ***ptr_int = null;

mov dword ptr ss:[ebp-0x18],0x64

將值0x64 放入棧空間位址 ss:[ebp-0x18]  實體地址為  00d3fbd0  00000064

對應c**  int i1 = 100;

這兩行** 先將  ss:[ebp-0x18] 位址賦給暫存器 eax,然後將eax值賦給位址 ss:[ebp-0x24]

00e41716    8d45 e8         lea eax,dword ptr ss:[ebp-0x18]

00e41719    8945 dc         mov dword ptr ss:[ebp-0x24],eax

對應c** 

int *ptr_1 = &i1; //一級記憶體位址空間偏移

這裡的 ss:[ebp-0x18]便是 整型變數i1的記憶體位址

這兩行** 做的事情同上,但注意位址變化了,這是是將位址 ss:[ebp-0x24] 賦給 ss:[ebp-0x30]

而 ss:[ebp-0x24]就是指標變數 int *ptr_1的值

00e4171c    8d45 dc         lea eax,dword ptr ss:[ebp-0x24]

00e4171f    8945 d0         mov dword ptr ss:[ebp-0x30],eax

對應c**

int **ptr_2 = &ptr_1; //二級記憶體位址空間偏移

這兩行** 做的事情同上,  將二級指標變數位址  ss:[ebp-0x30] 賦給  ss:[ebp-0xc]**指標變數

00e41722    8d45 d0         lea eax,dword ptr ss:[ebp-0x30]

00e41725    8945 f4         mov dword ptr ss:[ebp-0xc],eax

對應c**

ptr_int = &ptr_2; //**記憶體位址空間偏移

將3級指標位址對應的解引用 取 出來。

00e41728    8b45 f4         mov eax,dword ptr ss:[ebp-0xc]  

對應c**

int k = ***ptr_int;

從記憶體四區的角度來理解C 中的類

下屬專案 測試用例數量結論無 0試驗無1 先給出記憶體四區的概念 堆區 棧區 全域性區 區。詳情可自行搜尋,此處不作贅述。c 類中物件的成員變數和成員函式是分開儲存的。普通成員變數 儲存於物件 棧區或堆區 中,與struct變數有相同的記憶體布局和位元組對齊方式 會補齊 靜態成員變數 儲存於全域性區...

c語言 int轉char 深入理解C語言的指標

指標是c語言的乙個核心特色,它以一種統一方式對不同資料結構中的元素產生引用。對於新手來說,指標總是會帶來很多困惑,但其實指標的基本概念非常簡單。下面是一些指標和它們對映到機器 的關鍵原則。指標型別表明指標指向的是哪一類物件。比如 int ip char cpp 變數ip是乙個指向int型別物件的指標...

C語言基礎 C語言指標 3 指標的指標

上節課,我們講解了一些注意的事項以及指標的寫法,這節課我們來講解一下什麼叫做指標的指標.指標的指標,顧名思義就是指向指標的指標,當有乙個定義了乙個整型變數,定義乙個指標變數指向該整型變數,那麼指標變數存的位址就是整型變數的位址,而指標的指標指向該指標,那麼存的就是該指標的位址,下面我們看看示意圖 在...