講述兩點:
      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著 孫建樹 韋強 譯