• C++:不同类型的指针的本质与差异


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

    指针的类型(The Type of a Pointer)

               一个指向ZooAnimal(一个类)的指针是如何与一个指向整型的指针或者指向template Array的指针有所不同?

     

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

           以内存需求的观点来说,没有什么不同。以上三种类型都有足够的内存来放置一个机器地址(通常是一个word)。以上“指向不同类型的指针”间的差异,既不在于其指针表示方法不同,也不在于其内容(代表一个地址)不同,而是在于其所寻址出来的对象(object)类型不同。也就是说,“指针类型”会教导编译器如何解析某个特定地址中的内存内容及其大小。

            ZooAnimal类定义如下:

     

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

       protected:
           int loc;
           String name;
    };

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

           分析以上代码:

                                                                           

       图1:非派生类的对象布局和指针布局

     

             1、一个指向地址1000的整数指针,在32位机器上,将涵盖地址空间1000~1003(4个字节)

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

  • 相关阅读:
    JavaScript事件冒泡简介及应用
    个人作业——软件工程实践总结&个人技术博客
    个人技术总结
    个人作业——软件测评
    寒假作业(2/2)
    寒假作业(1/2)
    gitlab-ci.yml可用关键字描述
    gitlab-Runner配置参数详解
    gitlab-ci部署实现持续集成(centos7)
    linux时间同步操作命令
  • 原文地址:https://www.cnblogs.com/qinfengxiaoyue/p/4168942.html
Copyright © 2020-2023  润新知