C++:不一樣類型的指針的本質與差別

轉自:http://blog.csdn.net/richerg85/article/details/10076365

指針的類型(The Type of a Pointer)

           一個指向ZooAnimal(一個類)的指針是如何與一個指向整型的指針或者指向template Array的指針有所不一樣?c++

 

ZoolAnimal *px;
int *pi;
Array< String > *pta;佈局

       之內存需求的觀點來講,沒有什麼不一樣。以上三種類型都有足夠的內存來放置一個機器地址(一般是一個word)。以上「指向不一樣類型的指針」間的差別,既不在於其指針表示方法不一樣,也不在於其內容(表明一個地址)不一樣,而是在於其所尋址出來的對象(object)類型不一樣。也就是說,「指針類型」會教導編譯器如何解析某個特定地址中的內存內容及其大小。學習

        ZooAnimal類定義以下:.net

 

class ZooAnimal{
   public:
        ZoolAnimal();
         virtual ~ZoolAnimal();
         //...
         virtual void rotate();指針

   protected:
       int loc;
       String name;
};對象

ZooAnimal za( "Zoey" );
ZooAnimal *pza = &za;blog

       分析以上代碼:
內存

                                                                       

   圖1:非派生類的對象佈局和指針佈局字符串

 

         一、一個指向地址1000的整數指針,在32位機器上,將涵蓋地址空間1000~1003(4個字節)get

        二、若是String是傳統的8-bytes(包含一個4-bytes的字符指針和一個用來表示字符串長度的整數),那麼一個ZooAnimal指針將橫跨地址空間1000~1015(4+8+4)(?這個地方不是太明白,如上圖,int loc佔4個bytes,String 佔8個bytes,那4個bytes是vptr虛表佔的仍是地址1000佔的?本身認爲是vptr虛表佔的。)

        那麼一個指向地址1000而類型爲void*的指針,將涵蓋怎樣的地址空間?這個咱們是不知道的!這就是爲何一個類型爲void*的指針只可以含有一個地址,而不可以經過它操做所指對象的緣故。

      因此,轉型(cast)或者類型轉換,實際上是一種編譯器指令,大部分狀況下它並不改變一個指針所含的真正地址,它隻影響「被指出內存的大小和其內容「的解釋方式。(下一篇文章看完會懂這句話的意思的)

學習《深刻探索c++對象模型》所整理。

相關文章
相關標籤/搜索