以下main()
是我尝试解码指针值的重要性之一:
int main(){
int a = 15, b = 27;
int *p = &a, *q = &b;
cout << p << ',' << q;
}
打印的两个值是十六进制,即p = 0x28fef4, q = 0x28fef0
。它们看起来像十六进制值,以十进制表示2686708
和2686704
。
这提出了一些问题,您可以根据自己的喜好回答这些问题。
为什么q
小于p
?我希望按升序分配内存,但q < p
。
为什么地址很少改变?几个小时前我运行了一个类似的程序,我记得那个地址也是0x28fef4
。
十六进制值中的一个单位代表什么?一点点?一个字节?
我有大约8 GB的内存(RAM)。为什么p
和q
的值与我的RAM容量相比如此之小?
随意回答任何或所有这些问题,或提供有关指针的任何相关信息。
感谢。
答案 0 :(得分:6)
为什么q小于p?我希望记忆按升序分配,但q&lt;第
我不确定你为什么会这么想。它可能有什么不同?
为什么地址很少改变?几个小时前我运行了一个类似的程序,我记得那时的地址也是0x28fef4。
显然,您的平台不会随机化堆栈地址。相同的堆栈,相同的地址。
十六进制值中的一个单位代表什么?一点点?一个字节?
一个字节。
我有大约8 GB的内存(RAM)。为什么p和q的值与我的RAM容量相比如此之小?
物理内存与此无关。这些是虚拟内存地址,而不是物理内存地址。
答案 1 :(得分:0)
我希望按升序分配内存
这种期望完全没有根据。编译器不会根据源代码中的出现顺序或其他无关紧要的细节来订购。
为什么地址很少改变?
类似的源代码通常被翻译成类似的目标代码。这里有什么令人惊讶的?
十六进制值中的一个单位代表什么?一点点?一个字节?
一个字节(但请记住,“十六进制值”是用词不当,值是整数,符号是十六进制)。
为什么p和q的值如此之小
你的变量是自动的,这就是说“它们在堆栈中”的C方式。您的编译器在虚拟内存地址空间的开头附近分配堆栈。每个程序都有自己的虚拟内存地址空间,因此当两个同时运行的程序占用相同的虚拟地址范围时,它就可以了。