为什么此代码具有不同的输出

Why does this code has a different output?

本文关键字:输出 代码 为什么      更新时间:2023-10-16

这是我尝试使用类指针的问题

输出:

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;
}

Aobj指向堆上的对象。

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

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

cout << Aobj << endl;

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

cout << &Aobj << endl;

指针也是数据

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

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

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


将您的记忆视为书架。然后,指针是您可以将其他东西放在其中的假空心书籍之一,例如带有另一本书的地址(或另一本假空心书(的小笔记。假空心书籍也有一个地址,就像其他书籍一样,例如在此模型中使用操作员地址在一本书上创建了一本新的假空心书,遏制了一本带有指定书的地址的便条。堆可以看作是房间另一侧的另一个书架,该书籍可以在第一本书中的假书籍中处理。

 cout << Aobj << endl;

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

cout << &Aobj << endl;

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