C++ 如何在C+中检索新运算符分配的对象的地址+;?

C++ 如何在C+中检索新运算符分配的对象的地址+;?,c++,string,pointers,memory,new-operator,C++,String,Pointers,Memory,New Operator,我在堆上为一个对象留出内存,如下所示: string *myString = new string ("This is a string"). &myString 如果我想要这个对象的地址,我使用地址操作符,如下所示: string *myString = new string ("This is a string"). &myString 并接收myString的第一个字符的十六进制地址:0x28f3328 如果使用对象名而不使用address运算符: myString

我在堆上为一个对象留出内存,如下所示:

string *myString = new string ("This is a string").
&myString
如果我想要这个对象的地址,我使用地址操作符,如下所示:

string *myString = new string ("This is a string").
&myString
并接收myString的第一个字符的十六进制地址:
0x28f3328

如果使用对象名而不使用address运算符:

myString
我得到一个不同的十六进制数作为回报(
0x7a5380


第二个数字是多少?它意味着什么,还是仅仅是一些随机值?

您有一个对象指针,
string*myString。当您获取地址时,例如
&myString
,您无法获取对象的地址!您可以将地址指向指向它的指针。由于
myString
是一个指针,因此它已经是对象的地址

作为一种使这一点更清楚的方式,请考虑以下内容:

string *myString = new string("...");
string *anotherPointer = myString;
在这个代码中,
myString
另一个指针
都指向同一个对象;这里只有一个物体。但是,如果您查看
&myString
另一个指针
,您将看到这些指针位于不同的位置

*myString = new string ("This is a string").

这里的
myString
本身就是指针,所以它保留了一些内存的地址,也就是说,它的值就是地址。如果您
&myString
,您将获得
myString
的地址,因为指针在内存中也有一些地址

这是指针地址和指针指向的地址之间的区别

std::string *myString = new std::string;

std::cout << &myString << std::endl; // prints the address of the myString pointer
std::cout << myString << std::endl; // prints the address of what myString points to
std::string*myString=newstd::string;

std::cout我想你指的是标准类
std::string

对你问题的直接回答

如何在中检索由新运算符分配的对象的地址 C++?< /P> 运算符new返回在堆中分配的对象的地址。:)

在这份声明中

std::string *myString = new std::string ("This is a string");
您可以定义对象
myString
,该对象的值是堆中分配的
std::string
类型的未命名对象的地址

因此,使用expression
*myString
可以直接访问未命名对象。比如说

std::cout << *myString << std::endl;

它们给出了相同的结果。但是,在第二条语句中,您必须应用两次
运算符*

在可能的情况下始终使用具有自动存储持续时间的对象:

std::string myString("Some string");
std::string* ptrToString = &myString;    // initializing pointer with an address
请注意,您不太可能需要指向
std::string
对象的指针,干净的代码可能会使用引用来处理它


但如果您真的要动态分配它,那么这一行:

std::string* ptrToString = new std::string("Some string");

创建一个对象(很可能在堆上),并将其地址分配给
ptrToString
,使其指向该内存。但是
ptrToString
本身是一个具有自动存储持续时间的变量,它是存储字符串地址的内存
&ptrToString
生成存储指针的内存地址。

显示一些格式良好的代码部分,描述您试图理解的情况。&myString将为您提供堆栈地址,其中(string**)myString会给你实际分配的堆地址。所以第二个数字是实际分配的堆地址。这就是你发布问题时的样子。你将获得上升票而不是下降票:)。。。虽然你似乎没有花足够的精力自己寻找答案,但这些都是很容易找到的基础