如果我这样做,我希望这两个指针共享相同的地址:
char* foo, * bar=new char;
// or even
// char* foo=new char, * bar=new char;
bar = "Bar string";
foo = bar;
cout << "Foo: " << foo << " (" << &foo << ")" << endl;
cout << "Bar: " << bar << " (" << &bar << ")" << endl;
Output:
Foo: Bar string (0049F890)
Bar: Bar string (0049F884)
然而,我得到的两个地址略有不同(但不同)。是否有类似&#34;明确&#34;为这样的案件分配?并非我真的需要它,我调查了为什么当我指定一个地址等于另一个地址时,他们最终会有不同的地址
答案 0 :(得分:2)
&foo
和&bar
是变量的地址。因为有两个变量,所以它们具有不同的地址。
两个变量所持有的值虽然相同。通过测试确认
foo == bar
对于它的价值,使用new
毫无意义,因为你立即丢弃返回的值,从而泄漏内存。它应该是
char *bar = "Bar string";
char *foo = bar;
cout << foo == bar << endl;
答案 1 :(得分:1)
您没有打印(char *)地址foo和bar指向。
这是由于<<
运算符的重载定义:
char*
(第一种情况)打印它指向的字符串。对于任何其他指针类型,它将打印指针地址。但是对于char*
,行为是特殊的:它打印指向的值。char**
(第二种情况)打印其原始值,即指向char
的指针。这是传递除char*
http://www.cplusplus.com/reference/ostream/ostream/operator-free/
http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/
这意味着您正在打印:
你可以将foo和bar强制转换为void*
,以便将它们的值打印为原始指针:
cout << "Foo: " << foo << " (" << (void*)foo << ")" << endl;
cout << "Bar: " << bar << " (" << (void*)bar << ")" << endl;
旁注:您在第一行的堆上分配一个char,然后将指针设置为另一个值,而不删除它们。因此,你正在泄露记忆。
答案 2 :(得分:0)
在您的示例中,您将打印存储bar
和foo
可变品的地址。这两个变量都是指针,因此行为是相同的。
您可能正在寻找的是使用(void*)
:reinterpret_cast()
和reinterpret_cast<void*>(foo)
将变量投射到reinterpret_cast<void*> (bar)
,这将打印的起始内存位置变量指向:
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
char* foo, *bar = new char;
bar = "Bar string";
foo = bar;
cout << "Foo: " << foo << " (" << &foo << "," << reinterpret_cast<void*>(foo) << ")" << endl;
cout << "Bar: " << bar << " (" << &bar << "," << reinterpret_cast<void*>(bar) << ")" << endl;
return 0;
}