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()
Seth是正确的。至于cplusplus.com本身,已知它包含错误;大多数人更喜欢作为参考。好吧,谢谢你的提醒@chrisa,至少是那个网站。我想从你的链接中你提供了一个建议的更正?在阅读了这么多问题后,我把那个网站作为参考。你想推荐更好的参考资料吗?@ja_him他的意思是你的程序使用int main()
而不是void main()
Seth是正确的。至于cplusplus.com本身,已知它包含错误;大多数人喜欢作为参考。好的,谢谢@Christanks@Linuxios的提醒,所以我可以改为写int main()
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