相关疑难解决方法(0)

通过非const指针修改const

我对以下代码中发生的事情感到有点困惑:


const int e = 2;

int* w = ( int* ) &e;          // (1) cast to remove const-ness
*w = 5;                        // (2)

cout << *w << endl;            // (3) outputs 5
cout << e << endl;             // (4) outputs 2

cout << "w = " << w << endl;   // (5) w points to the address of e
cout << "&e = " << &e << endl;
Run Code Online (Sandbox Code Playgroud)

在(1)中,w指向e的地址.在(2)中,该值变为5.但是,当显示*w和e的值时,它们的值不同.但是如果你打印w指针和&e的值,它们具有相同的值/地址.

为什么e仍然包含2,即使它被改为5?他们存放在一个单独的位置?还是暂时的?但是,为什么w指出的价值仍然是e的地址?

c++ pointers casting const-correctness

13
推荐指数
2
解决办法
1021
查看次数

修改了c中的常量

const int z = 420;

printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
// O/P:420 | 420

printf("\n%u | %u",&z,(&(*(&z+1))-1) );             //address
// O/P:1310548  | 1310548

*((char *)&z+1) = 21;       //I change value for the 1st-Bit
                                    //corrupting constant

 printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
//the complex(not really) expression evaluates to z
// O/P:420| 5540

printf("\n%u | %u",&z ,(&(*(&z+1))-1) );                
//the complex(not really) expression evaluates to &z
// O/P:1310548 | 1310548
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

似乎我已成功修改了C中的常量

通过修改我的意思是我已经改变了常量地址范围中的位

因为"复杂(不是真的)统一/身份表达"在腐败后改变了价值.

但是z保持不变.为什么?

在解引用时,同一地址如何具有不同的值.?

PS:你可以使用任何身份表达

eg.printf("%d",*(int*)((char*)&(*((char*)&z+1))-1));
Run Code Online (Sandbox Code Playgroud)

[编辑]

好吧让我重新说一下:

z = 420

&z …
Run Code Online (Sandbox Code Playgroud)

c pointers constants

-1
推荐指数
3
解决办法
191
查看次数

标签 统计

pointers ×2

c ×1

c++ ×1

casting ×1

const-correctness ×1

constants ×1