1

在下面的代码中,基于阅读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并被束缚在(可能不正确的)语义中?

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

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

4

2 回答 2

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

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

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

于 2012-07-18T16:11:08.007 回答
1
  1. 它被声明为int*本身就是少量内存来存储地址的类型。指针变量始终是指针。当您使用解引用运算符时,您将获得对您存储的地址的变量的引用。
  2. 它是存储变量的虚拟内存的实际地址。它们以十六进制显示(很可能)。它不是“地址空间”(参见@Seth 的回答)
  3. 是的。当您进行分配时,您正在复制foointo的值fubar。但是,如果fubar是一个指针,并且您分配bar给它,它们的取消引用位置将是相同的。
于 2012-07-18T16:15:11.823 回答