我是C ++的新手,我对new
运营商的工作方式感到困惑。
我在堆上留出了一个对象的内存,如下所示:
string *myString = new string ("This is a string").
如果我想要这个对象的地址,我使用地址运算符,如下所示:
&myString
并接收myString的第一个字符的十六进制地址:0x28f3328
如果我使用没有地址运算符的对象名称:
myString
我得到一个不同的十六进制数作为回报(0x7a5380
)。
第二个号码是多少?它是什么意思,还是仅仅是一些随机值?
答案 0 :(得分:1)
你有一个对象指针string *myString;
。当您获取地址(例如&myString
)时,您无法获取对象的地址!你得到指向它的指针的地址。由于myString
是一个指针,因此它已经 您对象的地址。
为了更清楚地说明这一点,请考虑以下事项:
string *myString = new string("...");
string *anotherPointer = myString;
在此代码中,myString
和anotherPointer
都指向同一个对象;这里只有一个对象。但是,如果您查看&myString
和&anotherPointer
,您会看到这些指针位于不同的位置。
答案 1 :(得分:1)
这是指针地址与指针所指向的地址之间的区别。
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
答案 2 :(得分:0)
*myString = new string ("This is a string").
这里myString
本身就是指针,所以它保留了一些内存的地址,即它的值是地址。如果你&myString
,你将获得myString
的地址,因为指针在内存中也有一些地址。
答案 3 :(得分:0)
我认为你的意思是标准班std::string
对您提出的直接回复问题
如何检索由new运算符分配的对象的地址 C ++?
是operator new返回堆中分配的对象的地址。:)
在本声明中
std::string *myString = new std::string ("This is a string");
定义对象myString
,其值为堆中分配的std::string
类型的未命名对象的地址。
因此,使用表达式*myString
可以直接访问未命名的对象。例如
std::cout << *myString << std::endl;
表达式&myString
是对象myString本身的地址。它不是堆中分配的未命名对象的地址。
比较这两个陈述
std::cout << *myString << std::endl;
std::cout << **&myString << std::endl;
他们给出相同的结果。但是,在第二个声明中,您必须应用两次operator *
答案 4 :(得分:0)
在可能的情况下始终使用具有自动存储持续时间的对象:
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
产生一个存储器的地址,其中存储指针。