走進記憶體,走進彙編指令來看C/C++指標

來源:互聯網
上載者:User

推薦閱讀:

C++反組譯碼程式碼分析–函數調用

C++反組譯碼程式碼分析–迴圈結構

C++反組譯碼程式碼分析–偷調函數

走進記憶體,走進彙編指令來看C/C++指標

講述兩點:
      1、彙編下的p與*p
      2、有關指標初始化的金科玉律
int* p;
p與*p,相信很多人都在這犯過迷糊,最後在死記硬背中記住了他們的區別,但實際怎樣,也沒有親自到記憶體中看過,這裡,就帶您到記憶體中看看,到彙編中溜溜,看看p與*p的廬山真面目。
簡單的程式:

1#include <iostream>
2using namespace std;
3int main()
4{
5    int i = 1;
6    int* p=&i;
7}

先看彙編程式碼分析:
(如果您不理解為什麼[ebp-4][ebp-8]處存放的是函數第一和第二個局部變數,您可先閱讀《C++反組譯碼程式碼分析--函數調用 》)

看到很多人問 指標p指向一個地址,那指標p有自己的地址嗎?答案是肯定的,通過上面的分析可以看出 p的地址是0012ff40,此地址處存放的是變數i的地址。除了通過這種方式,其實還有一種可輸出的方式查看p自己的地址,int*(*q)=&p;則q存放的就是p的地址,可以自己輸出查看一下。

再從記憶體驗證以下是否真的如此:
我們已經分析出來p的地址是0012ff40,可以直接在記憶體觀察器中看一下,

最後一個小驗證,呵呵,直接在變數監視器中看(其實是最簡單的):

Ok,認識他們了吧,呵呵。在學習C++指標時,很多人都雲裡霧裡的,一會兒地址一會兒值的,老師說是啥,咱就背啥,最多也就是輸出看一下。我自己好奇心很強,什麼事情都喜歡刨根問底,那會兒最想掰開記憶體看看,到底是不是這樣,但那時我不會,特憋屈感覺。如果你也跟我一樣的話,看那,就是了,呵呵。其實自我感覺搞懂指標還是很有用的,特別是在學習跟安全有關的東西。
2、指標的初始化
只講一點,關於使用指標的金科玉律:一定要在對指標應用解除引用操作符(*)之前,將指標初始化一個確定的、適當的地址。
依然是一個簡單的小程式:

1#include <iostream>
2using namespace std;
3void main()
4{
5    int i = 1;
6    int* p;
7   //int*p = &i;
8    *p=1;
9}
//一共兩種情況,一種是之前給了指標一個確定的、適當的地址,然後賦值1,一種是沒有,直接賦值1

直接看彙編指令:

僅介紹指標初始化的這條金科玉律,至於初始化的其他動作,應該沒有什麼了,翻翻書,好多,不再贅述。
參考書籍:C++ primer plus Stephen Prata著 孫建樹 韋強 譯

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.