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会给你实际分配的堆地址。所以第二个数字是实际分配的堆地址。这就是你发布问题时的样子。你将获得上升票而不是下降票:)。。。虽然你似乎没有花足够的精力自己寻找答案,但这些都是很容易找到的基础