我正在试图弄清楚如何确定变量的内存地址。我不知道哪种方法正确使用。
#include <iostream>
#include <string>
using std::cout;
using std::endl;
void print(std::string *url) {
std::string url_1 = "http://example.com";
cout << url << endl;
cout << "Adress: " << &url << endl;
*url = url_1;
cout << "Adress: " << &url << endl;
}
int main() {
std::string a = "http://google.com";
print(&a);
cout << a << endl;
cout << &a << endl;
return 0;
}
输出:
0xbfa1ba48
Address: 0xbfa1ba34
Address: 0xbfa1ba34
http://example.com
0xbfa1ba48
当改变变量的内容时,内存地址是否也会改变?你如何获得变量的实际内存地址?
答案 0 :(得分:1)
在您的代码中url
是一个指针,包含传递给函数的任何地址,该地址恰好是a
的地址。请注意,每次输出url
和&a
时都会得到相同的结果。
另一方面,表达式&url
取自url
变量本身的地址(因此与它指向的字符串对象无关)。但同样,每次输出时&url
的值都是相同的。
所以不,改变一个对象不会改变它的内存地址。
答案 1 :(得分:0)
使用'&amp;'运算符是获取变量地址的正确方法。但是你的程序并没有很好地证明这一点。
void print(std::string *url) {
您正在接收变量网址中字符串对象的地址。
cout << "Adress: " << &url << endl;
这里打印的是包含字符串对象地址的变量的地址,而不是字符串对象本身的地址。
*url = url_1;
前面的'*'取消引用指针url,因此这将为原始变量赋值。
它不会更改指向原始字符串对象的指针的地址。
它甚至不会更改原始字符串对象的地址。 C ++中的字符串被实现为在内部存储指向包含字符串的字符数组的指针的对象,因此您只是更改字符串对象的内部内容,而不是它的地址。
一般情况下:为变量赋值不会改变变量的地址,只会改变变量的内容。
答案 2 :(得分:0)
我试图取消代码,
int pranit = 2;
int& sumit = pranit;
int main(int argc, char** argv) {
sumit++;
return sumit;
}
以下说明建议pranit有sumit的地址。
013B13C8 8B15 04803B01 MOV EDX,DWORD PTR [sumit] ; ConsoleA.pranit
此外,两个变量都有不同的地址,
Names in ConsoleA, item 313
Address=013B8004
Section=.data
Type=Library
Name=sumit
Names in ConsoleA, item 257
Address=013B8000
Section=.data
Type=Library
Name=pranit
我使用OllyDbg作为反汇编程序。
答案 3 :(得分:0)
获取变量地址的正确方法是使用std::addressof()
。
&
主要完成这项工作,但(可能)因重载operator &
(以及虚拟继承)而失败。