【问题标题】:Basic C++ pointer questions on dereferencing and address-space关于取消引用和地址空间的基本 C++ 指针问题
【发布时间】:2012-07-17 17:48:04
【问题描述】:

在下面的代码中,基于阅读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 具有相同的值,但它们是完全独立的并且没有公共地址空间?

【问题讨论】:

  • 至少是那个网站uses int main()
  • 我从您的链接中假设您提供了建议的更正?在阅读了 SO 问题后,我将该网站用作参考。您有更好的参考建议吗?
  • @ja_him 他的意思是你的程序不正确使用void main() 而不是int main()
  • 赛斯是对的。至于 cplusplus.com 本身,已知它包含错误;大多数人更喜欢en.cppreference.com/w/cpp 作为参考。
  • 好的,谢谢@chris 的提醒

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


【解决方案1】:
  1. 它被声明为int*类型,它本身就是一小块内存来存储地址。指针变量始终是指针。当您使用解引用运算符时,您将获得对您存储的地址的变量的引用。
  2. 它是存储变量的virtual memory 的实际地址。它们以十六进制显示(很可能)。它不是“地址空间”(参见@Seth 的回答)
  3. 是的。执行分配时,会将foo 的值复制到fubar。但是,如果 fubar 是一个指针,并且您将 bar 分配给它,那么它们的取消引用位置将是相同的。

【讨论】:

  • 谢谢@Linuxios,所以我可以改写int foo, fubar; int* bar; ?
【解决方案2】:
  • 答案 1:正确。变量bar 是一个指针,使用*bar 取消引用指针并计算指针指向的内容。尽管它不会评估为 [临时] 副本,而是对其目标的 引用

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

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

【讨论】:

  • 救济,感谢地址/地址空间的澄清。非常感谢@Seth :)
猜你喜欢
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多