Vik*_*rma 3 c++ memory constants
我从这里读到了这个问题,我也从c-faq中读到了相关问题,但我不明白这背后的确切原因: -
#include <iostream>
using namespace std;
int main()
{
//const int *p1 = (int*) &(5); //error C2101: '&' on constant
//cout << *p1;
const int five = 5;
const int *p2 = &(five);
cout << *p2 << endl;
char *chPtr = (char*) &("abcde");
for (int i=0; i<4; i++) cout << *(chPtr+i);
cout << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何存储常量(整数或字符串文字).我对字符串文字的理解是它们在程序启动时在全局静态内存中创建并持续到程序退出.在"abcde"即使我没有给它变量名称的情况下我也可以使用它的地址(chPtr)并假设我可能chPtr在程序终止之前的任何时候取消引用并且字符值仍然存在,即使我在范围之外取消引用它它被宣布的地方.const int变量是否"five"也放在全局静态中,并且该地址p2也可以随时引用?
为什么我可以拿地址,"five"但我不能要求:&(5)?常量"5"和"five"存储方式不同吗?哪里"5"存储在内存中?
你不能获取文字的地址(例如&(5)),因为文字没有"存储"在任何地方 - 它实际上写在汇编指令中.根据平台的不同,您将获得不同的说明,但MIPS64附加示例如下所示:
DADDUI R1, R1, #5
Run Code Online (Sandbox Code Playgroud)
尝试获取立即数的地址是没有意义的,因为它不驻留在(数据)内存中,但实际上是指令的一部分.
如果你声明a const int i = 5,并且不需要它的地址,编译器可以(并且可能会)将它转换为文字并放在5适当的汇编指令中.一旦你尝试获取地址i,编译器将看到它不能再这样做,并将它放在内存中.如果您只是尝试获取文字的地址,则情况并非如此,因为您尚未向编译器指示它需要为变量分配空间(当您声明a时const int i,它会在第一次传递中分配空间,并且稍后会确定它不再需要它 - 它反过来不起作用).
字符串常量存储在数据存储器的静态部分中 - 这就是为什么你可以获取它们的地址.