如何从“const int i”获取i的真实地址

时间:2012-06-04 08:22:52

标签: c++ const

int main()
{
  const int i = 10;
  int *p = (int*) &i;
  *p = 20; 
  printf("%d\n",i);   // 10
  printf("%d\n",*p);  // 20
}

我可以获得我的真实地址吗? 如果我想改变我的价值,我该怎么办呢? 原谅我可怜的英语!

3 个答案:

答案 0 :(得分:8)

  

我可以得到我的真实地址吗?

是:

const int* p = &i;
...
printf("%p\n", p);
  

如果我想更改i的值,我该怎么办?

你最好不要,它是未定义的行为。毕竟,const意味着“不能改变”不是吗?如果您确实想要因任何原因进行更改,则不应将其声明为const,句点。

在某些平台上,const数据被放入一个不同的只读内存段,并且尝试写入这些位置会导致段错误。此外,许多编译器用它们的字面值替换对const变量的引用,并且 - 在您的情况下似乎 - 尝试获取这些的地址可能会创建一个带有原始值副本的临时变量。因此,您只能更改临时值,而不能更改原始值。

答案 1 :(得分:4)

您可以像使用&i一样获得“真实”地址。

由于iconst限定对象,因此初始化后无法更改其值。

将表达式的结果强制转换为指向可修改int的指针是一个坏主意,因为它允许您编写导致未定义行为*p = 20;,因为它是尝试修改const对象的值。

答案 2 :(得分:1)

使用

printf("%p\n",p);

%p用于格式化指针值。

i的值无法更改,可能会导致各种错误(或根本不执行任何操作。)