在尝试使用指针时,我想到了更改指针地址的想法。我尝试了以下方法:
int* pointer;
&pointer = 0x28ff0d; //To point to an empty space in memory
但是这抛出了一个错误(详细信息:(在此处)第2行,左值是左操作数[...]),所以我想这不可能吗?我不是要创建一个空指针,而是要更改内存地址
答案 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
不是左值。赋值运算符的左侧必须有一个左值。