講述兩點:
1、匯編下的p與*p
2、有關指針初始化的金科玉律
int* p;
p與*p,相信很多人都在這犯過迷糊,最后在死記硬背中記住了他們的區(qū)別,但實際怎樣,也沒有親自到內(nèi)存中看過,這里,就帶您到內(nèi)存中看看,到匯編中溜溜,看看p與*p的廬山真面目。
簡單的程序:
#include <iostream>
using namespace std;
int main()
{
int i = 1;
int* p=&i;
}
先看匯編代碼分析:
(如果您不理解為什么[ebp-4][ebp-8]處存放的是函數(shù)第一和第二個局部變量,您可先閱讀《C++反匯編代碼分析–函數(shù)調(diào)用 》)
看到很多人問 指針p指向一個地址,那指針p有自己的地址么?答案是肯定的,通過上面的分析可以看出 p的地址是0012ff40,此地址處存放的是變量i的地址。除了通過這種方式,其實還有一種可輸出的方式查看p自己的地址,int*(*q)=&p;則q存放的就是p的地址,可以自己輸出查看一下。
再從內(nèi)存驗證以下是否真的如此:
我們已經(jīng)分析出來p的地址是0012ff40,可以直接在內(nèi)存觀察器中看一下,如圖:
最后一個小驗證,呵呵,直接在變量監(jiān)視器中看(其實是最簡單的):
Ok,認識他們了吧,呵呵。在學習C++指針時,很多人都云里霧里的,一會兒地址一會兒值的,老師說是啥,咱就背啥,最多也就是輸出看一下。我自己好奇心很強,什么事情都喜歡刨根問底,那會兒最想掰開內(nèi)存看看,到底是不是這樣,但那時我不會,特憋屈感覺。如果你也跟我一樣的話,看那,就是了,呵呵。其實自我感覺搞懂指針還是很有用的,特別是在學習跟安全有關的東西。
2、指針的初始化
只講一點,關于使用指針的金科玉律:一定要在對指針應用解除引用操作符(*)之前,將指針初始化一個確定的、適當?shù)牡刂贰?/p>
依然是一個簡單的小程序:
#include <iostream>
using namespace std;
void main()
{
int i = 1;
int* p;
//int*p = &i;
*p=1;
}
//一共兩種情況,一種是之前給了指針一個確定的、適當?shù)牡刂,然后賦值1,一種是沒有,直接賦值1
僅介紹指針初始化的這條金科玉律,至于初始化的其他操作,應該沒有什么了,翻翻書,好多,不再贅述。