在开始之前,首先科普一下cout指针的知识,这样才能在测试程序中很好的理解:

看下面的代码:

void main(void)
{
int a = 10;
int *p = &a; cout << a << endl;
cout << p << endl;
cout << *p << endl;
cout << &a << endl;
}

  执行结果:

从代码和执行的结果可以看出cout的实现原理:cout<<后面接一个变量的标识符,然后把这个标识符转换成对应的内存地址的门牌号,然后输出这个门牌号里存储的数据。

特别地:cout<<一个指针的时候,要弄明白两件事,输出的结果是这个指针所指向的内存单元的门牌号码,同时还要弄明白这个指针变量的实际存放在内存的哪个内存单元里面。例如:cout<<p这个的输出是p指向的内存单元的门牌号,也就是a的门牌号,但是p的实际存放位置在p对应的内存空间中。


看一个复杂的模型:

  1. &d表示这个类对象的指针,cout<<(&d)输出的是这个对象的内存地址,这个地址原来存放在了符号表中。
  2. (int*)(&d)表示一个指向int类型的指针,但是这个指针的起始地址和&d是一样的,只是类型改变了。cout<<((int*)(&d))输出的值和cout<<&d是一样的。
  3. *(int*)(&d)表示一个指向虚函数表的指针,这个指针指向的是虚函数表的起始地址,cout<<这个指针的结果是这个指针所指向的内存单元的门牌号。同时,存储这个指针变量的内存单元是_vptr_Derived,所以得到的输出结果是存储在Derived对象中的,也就是_vptr_Derived的值。
  4. (int*)*(int*)(&d)+1指向虚函数表中第二个slot的指针,cout<<的结果是指向内存单元的门牌号。这个指针是计算得到的,没有内存单元存放这个指针变量的值。
  5. *((int*)*(int*)(&d)+1)这个指针指向void Derived::print(void) const这个函数的函数指针,但是cout这个指针的结果是这个指针所指向的内容的门牌号,但是这个指针的值实际存放的内存位置是虚函数表中的第二个slot的内容。

C++对象模型2--指针cout结果的更多相关文章

  1. 第51课 C++对象模型分析(下)

    1. 单继承对象模型 (1)单一继承 [编程实验]继承对象模型初探 #include <iostream> using namespace std; class Demo { protec ...

  2. 从汇编看c++中指向成员变量的指针(一)

    在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...

  3. 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)

    一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...

  4. private成员变量真的私有吗?(用指针刨他祖坟)

    今天写程序时突然想到的,为什么不用指针去获取类的成员变量呢.于是做了这个实验.首先定义了一个类: class Test { private: int i; char c; int* p; public ...

  5. 【C++】动态内存与智能指针

    C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...

  6. [c/c++]指针数组 pk 数组指针

    首先强调 指针数组归根结底是个数组:数组指针归根结底是个指针. 数组指针 以int (*int)[10]为例 ()的优先级大于[],因此首先它是一个指针,它指向一个数组,数组的维数是10.因此数组指针 ...

  7. c++11之智能指针

    在c++98中,智能指针通过一个模板“auto_ptr”来实现,auto_ptr以对象的方式来管理堆分配的内存,在适当的时间(比如析构),释放所获得的内存.这种内存管理的方式只需要程序员将new操作返 ...

  8. 【C++基础】指针好难啊,一点点啃——基本概念

    指针保存的是另一个对象的地址(概念真的很重要!!) ; int *ptr = &a;//*定义一个指向int类型的指针ptr, &a取变量a的地址 引用是对象的别名,多用于函数形参,引 ...

  9. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

随机推荐

  1. cdoj 邱老师看电影

    //第一次写概率dp //写成记忆化搜索的形式比递推要更方便易懂 //不过好像还是可以写成递推的形式的 但是比较那个…… #include<cstdio> #include<iost ...

  2. sql优化-总结

    1.尽量缩小数据范围. 2.能一个sql解决的,坚决不用两条sql.利用case when或decode. select month_id, corppkno, sum(exportSum_new) ...

  3. c#搭建服务端 准备工作(1)

    思路 搭建服务器主要为了接收客户端所传来的数据,在学习过程中,整体的搭建逻辑大体分为以下几个步骤: 1.启动线程监听服务端口 2.监听客户端链接并进行处理 3.接收客户端传入的消息 4.向客户端回传( ...

  4. SVN使用Tips

    1. 如果在本地删除了某个文件,在Cornerstone上的本地仓库会出现D的标志,并且文件不存在. 这时,只需要将该文件提交到服务器上,本地仓库就会清除了已删除的文件的标识,同时,服务器上也会自动删 ...

  5. java中解决request中文乱码问题

    request乱码问题(当我们提交的数据中含有中文信息时),分两种情况: 通过post方式提交数据给Servlet Servlet服务端部分代码: public void doPost(httpSer ...

  6. fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'

    xxxxxx.lib(xxxxxx.obj) : fatal error LNK1112: module machine type 'X86' conflicts with target machin ...

  7. WPF中常用控件的属性

    Source = new BitmapImage( new Uri( WangCaiConfig.GetCurrentDirectory() + imgStr, UriKind.RelativeOrA ...

  8. Java动态代理机制——JDK

    动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...

  9. Java基础之静态变量

    public class StaticVariable { public static void main(String[] args) { Person p1 = new Person(); Per ...

  10. jQuery实时获取checkbox状态问题

    在最近的项目开发中,使用jQuery操作checkbox时,发现一个问题. Html代码如下: <body> <div> <inputtype="checkbo ...