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

时间:2014-01-16 03:43:39

标签: c++ pointers memory

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

#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

当改变变量的内容时,内存地址是否也会改变?你如何获得变量的实际内存地址?

4 个答案:

答案 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 &(以及虚拟继承)而失败。