我从 here 读到这个问题我还阅读了 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;
}
我想知道常量(整数或字符串文字)是如何存储的。我对字符串文字的理解是,它们是在程序启动时在全局静态内存中创建的,并一直存在到程序退出。在 "abcde"
的情况下,即使我没有给它一个变量名,我也可以使用它的地址 (chPtr
) 并且我假设我可能可以取消引用 chPtr
在程序终止之前的任何时间,字符值仍然存在,即使我在声明它的范围之外取消引用它。 const int
变量"five"
是否也放在global static中,那个地址p2
也可以随时引用?
为什么我可以获取 "five"
的地址,但我不能请求:&(5)
?常量 "5"
和 "five"
的存储方式不同吗? "5"
在内存中的存储位置?
最佳答案
您不能获取文字的地址(例如 &(5)
),因为文字没有“存储”在任何地方——它实际上是写在汇编指令中的。根据平台的不同,您会得到不同的指令,但 MIPS64 加法示例如下所示:
DADDUI R1, R1, #5
尝试获取立即数的地址是没有意义的,因为它不驻留在(数据)内存中,但实际上是指令的一部分。
如果您声明了一个const int i = 5
,并且不需要它的地址,编译器可以(并且很可能会)将它转换为文字并放置5
在适当的汇编指令中。一旦您尝试获取 i
的地址,编译器将发现它不能再这样做,并将其放入内存中。如果您只是尝试获取文字的地址,则情况并非如此,因为您没有向编译器指示它需要为变量分配空间(当您声明 const int i
时,它在第一遍中分配空间,稍后将确定它不再需要它 - 它不会在相反的情况下起作用)。
字符串常量存储在数据存储器的静态部分 - 这就是为什么您可以获取它们的地址。
关于c++ - 常量存储在哪里以及如何存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21735890/