int main()
{
const int i = 10;
int *p = (int*) &i;
*p = 20;
printf("%d\n",i); // 10
printf("%d\n",*p); // 20
}
我可以获得我的真实地址吗? 如果我想改变我的价值,我该怎么办呢? 原谅我可怜的英语!
答案 0 :(得分:8)
我可以得到我的真实地址吗?
是:
const int* p = &i;
...
printf("%p\n", p);
如果我想更改i的值,我该怎么办?
你最好不要,它是未定义的行为。毕竟,const
意味着“不能改变”不是吗?如果您确实想要因任何原因进行更改,则不应将其声明为const
,句点。
在某些平台上,const数据被放入一个不同的只读内存段,并且尝试写入这些位置会导致段错误。此外,许多编译器用它们的字面值替换对const变量的引用,并且 - 在您的情况下似乎 - 尝试获取这些的地址可能会创建一个带有原始值副本的临时变量。因此,您只能更改临时值,而不能更改原始值。
答案 1 :(得分:4)
您可以像使用&i
一样获得“真实”地址。
由于i
是const
限定对象,因此初始化后无法更改其值。
将表达式的结果强制转换为指向可修改int
的指针是一个坏主意,因为它允许您编写导致未定义行为的*p = 20;
,因为它是尝试修改const
对象的值。
答案 2 :(得分:1)
使用
printf("%p\n",p);
%p
用于格式化指针值。
i
的值无法更改,可能会导致各种错误(或根本不执行任何操作。)