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

C++ 基本C++;关于解引用和地址空间的指针问题,c++,variables,pointers,dereference,address-space,C++,Variables,Pointers,Dereference,Address Space,在下面的代码中,基于阅读,我试图测试我对指针的基本理解 #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 <&

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

#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();
}
其中,
xx
是一些在每次运行时都会更改的长数字。 当我添加以下内容时:

    cout << "the address of foo is " << &foo << endl;
    cout << "the address of fubar is " << &fubar << endl;
其中
xy
与运行时的
xx
不同

  • 问题1:在声明中,声明
    *bar
    是否在该时刻将其作为一个“指针”,直到它被使用,即
    fubar=*bar
    在哪一点是一个未引用的变量?或者,指针总是一个变量,而这只是我的一个习惯,并且被(可能不正确的)语义束缚住了

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

  • 问题3:我认为虽然
    fubar
    foo
    具有相同的值,但它们是完全独立的,没有公共地址空间,这对吗

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

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

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

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

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

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

        • 它被声明为类型
          int*
          ,这是存储地址的少量内存。指针变量始终是指针。当您使用解引用运算符时,您将获得对存储地址的变量的引用
        • 它是存储变量的实际地址。它们以十六进制显示(最有可能)。它不是一个“地址空间”(见@Seth的答案)
        • 对。执行赋值时,您正在将
          foo
          的值复制到
          fubar
          中。但是,如果
          fubar
          是指针,并且您将
          bar
          指定给它,则它们的取消引用位置将是相同的
        • 它被声明为类型
          int*
          ,这是存储地址的少量内存。指针变量始终是指针。当您使用解引用运算符时,您将获得对存储地址的变量的引用
        • 它是存储变量的实际地址。它们以十六进制显示(最有可能)。它不是一个“地址空间”(见@Seth的答案)
        • 对。执行赋值时,您正在将
          foo
          的值复制到
          fubar
          中。但是,如果
          fubar
          是指针,并且您将
          bar
          指定给它,则它们的取消引用位置将是相同的
          请放心,感谢您对地址/地址空间的澄清。非常感谢@Seth:)的安慰,感谢地址/地址空间的澄清。非常感谢@Seth:)至少是那个网站。我想从你的链接中你提供了一个建议的更正?在阅读了这么多问题后,我把那个网站作为参考。你想推荐更好的参考资料吗?@ja_him他的意思是你的程序使用
          void main()
          而不是
          int main()
          Seth是正确的。至于cplusplus.com本身,已知它包含错误;大多数人更喜欢作为参考。好吧,谢谢你的提醒@chrisa,至少是那个网站。我想从你的链接中你提供了一个建议的更正?在阅读了这么多问题后,我把那个网站作为参考。你想推荐更好的参考资料吗?@ja_him他的意思是你的程序使用
          void main()
          而不是
          int main()
          Seth是正确的。至于cplusplus.com本身,已知它包含错误;大多数人喜欢作为参考。好的,谢谢@Christanks@Linuxios的提醒,所以我可以改为写
          intfoo,fubar
          int*条?谢谢@Linuxios,所以我可以改写
          intfoo,fubar
          int*条
              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