C++-如何正确地确定变量的地址

C++ - How to correctly determine the address of a variable?

本文关键字:变量 地址 正确地 C++-      更新时间:2023-10-16

我正试图弄清楚如何确定变量的内存地址。我不知道哪种方法是正确的。

#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

当改变一个变量的内容时,内存地址也会改变吗?如何获得变量的实际内存地址?

在代码中,url是一个指针,包含传递给函数的任何地址,恰好是a的地址。请注意,每次输出url&a时都会得到相同的结果。

另一方面,表达式&urlurl变量本身的地址(因此与它所指向的字符串对象无关)。但是,&url的值在每次输出时都是相同的

所以不,改变一个对象不会改变它的内存地址。

使用'&'运算符是获取变量地址的正确方法。然而,你的程序并没有很好地证明这一点。

void print(std::string *url) {

您正在接收变量URL中的字符串对象的地址。

cout << "Adress: " << &url << endl;

这里打印的是包含字符串对象地址的变量的地址,而不是字符串对象本身的地址。

*url = url_1;

前面的"*"取消引用指针url,因此这是为原始变量分配一个新值。

它不会更改指向原始字符串对象的指针的地址。

它甚至不会更改原始字符串对象的地址。C++中的字符串被实现为对象,这些对象在内部存储指向包含字符串的字符数组的指针,所以您只是在更改字符串对象的内部内容,而不是它的地址。

一般来说:为变量赋值不会更改变量的地址,只会更改其内容。

我试图分解以下代码,

int pranit = 2;
int& sumit = pranit;
int main(int argc, char** argv) {
sumit++;
return 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作为反汇编程序。

获取变量地址的正确方法是使用std::addressof()

&主要完成这项工作,但(可能)会因operator &过载(以及虚拟继承)而失败。