在下面的代码中,基于阅读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 :我认为虽然fubar
和foo
具有相同的值,但它们完全独立且没有共同的地址空间吗?
答案 0 :(得分:6)
回答1 :正确。变量bar
是一个指针,使用*bar
取消引用指针并计算指针指向的内容。要意识到它不会评估为[临时]副本,而是评估引用到其目标。
答案2 :“地址空间”与“地址”不同;变量的地址只是它在内存中的位置,而程序的“地址空间”是它可以使用的所有内存。变量没有地址空间,程序可以。您在计划输出中看到的是地址(foo
和fubar
的地址)。
回答3 :是的,你是对的。它们具有相同的值,但是一个会发生什么不会影响另一个(它们位于不同的地址,因此是不同的对象)。
答案 1 :(得分:1)
int*
,它是存储地址的少量内存。指针变量始终是指针。当您使用解除引用运算符时,您将获得对您存储的地址的变量的引用。foo
的值复制到fubar
。但是,如果fubar
是指针,并且您为其指定了bar
,则其解除引用的位置将是相同的。