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

我能得到我的真实地址吗?如果我想改变 i 的值,我该怎么做?原谅我可怜的英语!

4

3 回答 3

8

我能得到我的真实地址吗?

是的:

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

如果我想改变 i 的值,我该怎么做?

你最好不要,这是未定义的行为。毕竟,const意思是“不能改变”不是吗?如果您出于某种原因确实想更改它,则不应将其声明为const, 句点。

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

于 2012-06-04T08:24:40.173 回答
4

你得到的“真实”地址与你所做的完全一样&i

作为i一个const合格的对象,一旦它被初始化,你就不能改变它的值。

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

于 2012-06-04T08:25:29.387 回答
1

利用

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

%p旨在格式化指针值。

i的值不能更改,可能会导致各种错误(或什么都不做。)

于 2012-06-04T08:25:01.243 回答