C ++地址十六进制代表什么?

时间:2014-12-09 17:49:11

标签: c++ pointers memory

以下main()是我尝试解码指针值的重要性之一:

int main(){
    int a = 15, b = 27;
    int *p = &a, *q = &b;
    cout << p << ',' << q;
}

打印的两个值是十六进制,即p = 0x28fef4, q = 0x28fef0。它们看起来像十六进制值,以十进制表示26867082686704

这提出了一些问题,您可以根据自己的喜好回答这些问题。

  1. 为什么q小于p?我希望按升序分配内存,但q < p

  2. 为什么地址很少改变?几个小时前我运行了一个类似的程序,我记得那个地址也是0x28fef4

  3. 十六进制值中的一个单位代表什么?一点点?一个字节?

  4. 我有大约8 GB的内存(RAM)。为什么pq的值与我的RAM容量相比如此之小?

  5. 随意回答任何或所有这些问题,或提供有关指针的任何相关信息。

    感谢。

2 个答案:

答案 0 :(得分:6)

  

为什么q小于p?我希望记忆按升序分配,但q&lt;第

我不确定你为什么会这么想。它可能有什么不同?

  

为什么地址很少改变?几个小时前我运行了一个类似的程序,我记得那时的地址也是0x28fef4。

显然,您的平台不会随机化堆栈地址。相同的堆栈,相同的地址。

  

十六进制值中的一个单位代表什么?一点点?一个字节?

一个字节。

  

我有大约8 GB的内存(RAM)。为什么p和q的值与我的RAM容量相比如此之小?

物理内存与此无关。这些是虚拟内存地址,而不是物理内存地址。

答案 1 :(得分:0)

我希望按升序分配内存

这种期望完全没有根据。编译器不会根据源代码中的出现顺序或其他无关紧要的细节来订购。

为什么地址很少改变?

类似的源代码通常被翻译成类似的目标代码。这里有什么令人惊讶的?

十六进制值中的一个单位代表什么?一点点?一个字节?

一个字节(但请记住,“十六进制值”是用词不当,值是整数,符号是十六进制)。

为什么p和q的值如此之小

你的变量是自动的,这就是说“它们在堆栈中”的C方式。您的编译器在虚拟内存地址空间的开头附近分配堆栈。每个程序都有自己的虚拟内存地址空间,因此当两个同时运行的程序占用相同的虚拟地址范围时,它就可以了。