关于解除引用和地址空间的基本C ++指针问题

时间:2012-07-18 16:07:09

标签: c++ variables pointers dereference address-space

在下面的代码中,基于阅读cplusplus.com,我试图测试我对指针的基本理解。

#include <iostream>
using namespace std;

int main() {
    int foo, *bar, fubar;
    foo = 81;
    bar = &foo;
    fubar = *bar;
    cout << "the value of foo is " << foo << endl;
    cout << "the value of &foo is " << &foo << endl;
    cout << "the value of bar is " << bar << endl;
    cout << "the value of *bar is " << *bar << endl;
    cout << "the value of fubar is " << fubar << endl;
    cin.get();
}

这导致输出:

the value of foo is 81
the value of &foo is xx
the value of bar is xx
the value of *bar is 81
the value of fubar is 81

其中xx是在每个运行时更改的长数字。 当我添加以下内容时:

    cout << "the address of foo is " << &foo << endl;
    cout << "the address of fubar is " << &fubar << endl;

导致:

the address of foo is xx
the address of fubar is xy

xy在运行时与xx不同。

  • 问题1 :在声明中,声明*bar在那个时刻是否为“指针”,直到它被使用为止fubar = *bar在哪一点上它是一个解除引用的变量?或者是指针始终是一个变量,而这只是我得到所有的nooby并被束缚在(可能是不正确的)语义中?

  • 问题2 xx是一个更改每个运行时的长数字,所以我是对的,它是地址空间吗?

  • 问题3 :我认为虽然fubarfoo具有相同的值,但它们完全独立且没有共同的地址空间吗?

2 个答案:

答案 0 :(得分:6)

  • 回答1 :正确。变量bar是一个指针,使用*bar取消引用指针并计算指针指向的内容。要意识到它不会评估为[临时]副本,而是评估引用到其目标。

  • 答案2 :“地址空间”与“地址”不同;变量的地址只是它在内存中的位置,而程序的“地址空间”是它可以使用的所有内存。变量没有地址空间,程序可以。您在计划输出中看到的是地址(foofubar的地址)。

  • 回答3 :是的,你是对的。它们具有相同的值,但是一个会发生什么不会影响另一个(它们位于不同的地址,因此是不同的对象)。

答案 1 :(得分:1)

  1. 它被声明为类型int*,它是存储地址的少量内存。指针变量始终是指针。当您使用解除引用运算符时,您将获得对您存储的地址的变量的引用。
  2. 它是存储变量的virtual memory的实际地址。它们以十六进制显示(最有可能)。它不是“地址空间”(见@ Seth的答案)
  3. 是。执行作业时,您将foo的值复制到fubar。但是,如果fubar是指针,并且您为其指定了bar,则其解除引用的位置将是相同的。