C++中如何改变指针指向的地址
How to change the address a pointer is pointing to in C++
在尝试使用指针时,我想到了将地址更改为指针。我尝试了以下方法:
int* pointer;
&pointer = 0x28ff0d; //To point to an empty space in memory
但这抛出了一个错误(详细信息:(此处)在第 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
您永远无法更改变量的地址。因此,无论 T 是什么(无论是 int 或 double 之类的内部类型、结构、指针还是数组,C++ 中都禁止使用以下内容:
T var;
&var = anything; // WRONG! &var is not a lvalue
错误lvalue required as left operand意味着你只能赋值给可以接收新值的东西,而变量的地址则不能。
指针是一个变量。任何变量都有它所在的地址。因此,如果您声明了一个变量,例如int x;
,那么&x
就是那个变量所在的地址。
指针是驻留在某处的变量,但除此之外它还有一个值,该值恰好是某个其他变量的地址。所以如果你已经声明了一个指针 int* x;
,并向它写入了一些东西,那么 x
将代表你写入它的一些地址,而 *x
将是指向的值指针。
所以你的语法错误是使用了 &
而你应该只使用变量名,而不是 &
。弄清楚这一点后,请务必阅读其他答案,这些答案解释了您的代码的更多问题。
int* pointer;
&pointer = 0x28ff0d;
这将引发错误,因为 &pointer
不是左值。赋值运算符的左边必须有一个左值。
在尝试使用指针时,我想到了将地址更改为指针。我尝试了以下方法:
int* pointer;
&pointer = 0x28ff0d; //To point to an empty space in memory
但这抛出了一个错误(详细信息:(此处)在第 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
您永远无法更改变量的地址。因此,无论 T 是什么(无论是 int 或 double 之类的内部类型、结构、指针还是数组,C++ 中都禁止使用以下内容:
T var;
&var = anything; // WRONG! &var is not a lvalue
错误lvalue required as left operand意味着你只能赋值给可以接收新值的东西,而变量的地址则不能。
指针是一个变量。任何变量都有它所在的地址。因此,如果您声明了一个变量,例如int x;
,那么&x
就是那个变量所在的地址。
指针是驻留在某处的变量,但除此之外它还有一个值,该值恰好是某个其他变量的地址。所以如果你已经声明了一个指针 int* x;
,并向它写入了一些东西,那么 x
将代表你写入它的一些地址,而 *x
将是指向的值指针。
所以你的语法错误是使用了 &
而你应该只使用变量名,而不是 &
。弄清楚这一点后,请务必阅读其他答案,这些答案解释了您的代码的更多问题。
int* pointer;
&pointer = 0x28ff0d;
这将引发错误,因为 &pointer
不是左值。赋值运算符的左边必须有一个左值。