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++对象模型》所整理。

相关文章
相关标签/搜索