如何在C ++中更改指针指向的地址

时间:2019-01-21 16:04:26

标签: c++ pointers memory-address

在尝试使用指针时,我想到了更改指针地址的想法。我尝试了以下方法:

int* pointer; 
&pointer = 0x28ff0d; //To point to an empty space in memory

但是这抛出了一个错误(详细信息:(在此处)第2行,左值是左操作数[...]),所以我想这不可能吗?我不是要创建一个空指针,而是要更改内存地址

4 个答案:

答案 0 :(得分:2)

出于明显的原因,将指针设置为硬编码地址不是一个好主意。但是,您可以通过reinterpret_cast<>将地址设置为您要为其分配的类型,例如:

int * pointer = reinterpret_cast<int *>(0xDEADBEEF);

int * pointer = &some_int;
. . .
pointer = reinterpret_cast<int *>(0xDEADBEEF);

请注意,在这种情况下,取消引用pointer是未定义的行为...但是,这样做对于调试“免用后使用”仍然很有用,在该情况下,像0xDEADBEEF这样的前哨值可以清楚地表明您已经已经释放了该内存。

显然,更常见,更有用且更安全的更改指向的地址的情况是采用不同(真实)数据的地址:

int * pointer = &some_int;
int new_val = 1234;
pointer = &new_val; // *pointer is now 1234

答案 1 :(得分:0)

您永远不能更改变量的地址。因此,无论T是什么(无论是int或double的内在类型,还是结构,指针或数组,在C ++中都是禁止的:

T var;
&var = anything;   // WRONG! &var is not a lvalue

错误需要左操作数的左值 意味着您只能分配给可以接收新值的对象,而变量的地址不能。

答案 2 :(得分:0)

指针是一个变量。任何变量都有一个地址。因此,如果您声明了一个变量,例如int x;,然后&x是该变量所在的地址。

指针是一个驻留在某个地方的变量,但是它还有一个值,该值恰好是其他某个变量的地址。因此,如果您声明了指针int* x;,并向其写了一些东西,那么x将代表您已写入的某个地址,而*x将是由指针。

因此,您的语法错误是使用&,而您应该只使用变量名,而不使用&。弄清楚这一点之后,请务必阅读其他答案,以解释代码的进一步问题。

答案 3 :(得分:0)

int* pointer; &pointer = 0x28ff0d;

这将引发错误,因为&pointer不是左值。赋值运算符的左侧必须有一个左值。