推薦閱讀:
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著 孫建樹 韋強 譯