为什么这段代码有不同的输出?

时间:2018-02-10 12:04:12

标签: c++ class pointers cout

这是我的问题,我尝试使用类指针但是当我尝试获取A类的内存地址时,我得到了不同的输出

输出:

0148D460
00FAFA84

代码:

#include "stdafx.h"
#include <iostream>
#include "TestClass.h"

using namespace std;

int main()
{
    A *Aobj = new A;
    B Bobj;
    cout << Aobj << endl;
    cout << &Aobj << endl;
    getchar();
    delete Aobj;

    return 0;
}

3 个答案:

答案 0 :(得分:4)

Aobj指向堆上的对象。

      | Stack |         | Heap  |
&Aobj |A* Aobj|   -->   | new A |
      |B Bobj |

这两个输出之间的区别是第一个输出对象Aobj指向的对象的地址,在堆上

cout << Aobj << endl;

,第二个是在堆栈上打印指针Aobj的地址

cout << &Aobj << endl;

答案 1 :(得分:0)

 cout << Aobj << endl;

正在打印存储在“A *”类型变量中的值。同时,

cout << &Aobj << endl;

正在打印该变量放在内存中的地址。

答案 2 :(得分:0)

指针也是数据

本地声明的所有变量表示存储在堆栈中的对象。动态分配和自动对象之间的区别在于自动对象将其数据直接存储在堆栈上,而动态分配的对象在堆栈上存储指向堆上数据的指针。

当您使用<<运算符输出指向标准输出的指针时,会发生的是打印出对象内容(A的地址)。

将内置地址运算符*应用于对象时,它会在堆栈上创建并返回指向给定对象的指针。在输出返回的指针时,在第二种情况下,使用<<,然后打印其内容,这是第一个指针的地址。

把你的记忆想象成一个书架。然后指针是那些假的空心书之一,你可以把其他东西放在里面,就像一个带有地址的小纸条到另一本书(或另一本假空心书)。假空心书也有一个地址,就像其他书一样,例如 左起第三个,第二个架子等。在这个模型中使用地址运算符在一本书上创建一个新的假空心书,其中包含一个带有指定书籍地址的笔记。堆可以看作是房间另一侧的另一个书架,其书籍可以在第一个书架的假书中找到。