講述兩點(diǎn):
      1、反匯編下的p與*p
      2、有關(guān)指針初始化的金科玉律
int* p;
p與*p,相信很多人都在這犯過迷糊,最后在死記硬背中記住了他們的區(qū)別,但實(shí)際怎樣,也沒有親自到內(nèi)存中看過,這里,就帶您到內(nèi)存中看看,到反匯編中溜溜,看看p與*p的廬山真面目。
簡單的程序:

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

先看反匯編代碼分析:
(如果您不理解為什么[ebp-4][ebp-8]處存放的是函數(shù)第一和第二個(gè)局部變量,您可先閱讀《C++反匯編代碼分析--函數(shù)調(diào)用 》)

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

再從內(nèi)存驗(yàn)證以下是否真的如此:
我們已經(jīng)分析出來p的地址是0012ff40,可以直接在內(nèi)存觀察器中看一下,如圖:



最后一個(gè)小驗(yàn)證,呵呵,直接在變量監(jiān)視器中看(其實(shí)是最簡單的):


Ok,認(rèn)識他們了吧,呵呵。在學(xué)習(xí)C++指針時(shí),很多人都云里霧里的,一會兒地址一會兒值的,老師說是啥,咱就背啥,最多也就是輸出看一下。我自己好奇心很強(qiáng),什么事情都喜歡刨根問底,那會兒最想掰開內(nèi)存看看,到底是不是這樣,但那時(shí)我不會,特憋屈感覺。如果你也跟我一樣的話,看那,就是了,呵呵。其實(shí)自我感覺搞懂指針還是很有用的,特別是在學(xué)習(xí)跟安全有關(guān)的東西。
2、指針的初始化
只講一點(diǎn),關(guān)于使用指針的金科玉律:一定要在對指針應(yīng)用解除引用操作符(*)之前,將指針初始化一個(gè)確定的、適當(dāng)?shù)牡刂贰?br>依然是一個(gè)簡單的小程序:
1#include <iostream>
2using namespace std;
3void main()
4{
5    int i = 1;
6    int* p;
7   //int*p = &i;
8    *p=1;
9}
//一共兩種情況,一種是之前給了指針一個(gè)確定的、適當(dāng)?shù)牡刂罚缓筚x值1,一種是沒有,直接賦值1
直接看反匯編指令:


僅介紹指針初始化的這條金科玉律,至于初始化的其他操作,應(yīng)該沒有什么了,翻翻書,好多,不再贅述。
參考書籍:C++ primer plus Stephen Prata著 孫建樹 韋強(qiáng) 譯