首页 > 解决方案 > 在 C++ 中更改存储在特定地址中的值

问题描述

我最近开始使用 C++ 进行面向对象的软件开发,但在尝试理解指针时遇到了一些问题。我正在使用 Qt Creator 3.3.0。

1. 使用 (*type) 在变量中存储一个新地址

为什么我总是被要求做:

 int* y = ( int*) 0x61fe9c;

存储和寻址而不是:

 int* y = 0x61fe9c;

指针不应该理解我正在存储内存位置的十六进制地址吗?

2. 在指针中存储新的特定地址

我试图理解为什么一旦将特定地址存储在指针中,就必须以不同的方式存储新地址:

int* y = ( int*) 0x61fe9c;
*y = 0x61fe9d;

如果我这样做,则地址将毫无问题地存储,但如果我想以其他方式存储它:

*y = (int*) 0x61fe9d;

编译器给了我invalid conversion from 'int*' to 'int'.

为什么我不能更改如上所示存储的地址的值?

先感谢您。

标签: c++

解决方案


为什么我总是被要求做:

int* y = ( int*) 0x61fe9c;

存储和寻址而不是:

int* y = 0x61fe9c;

因为 C++ 有一个强大的类型系统。

类型系统旨在防止程序员在无意中将一种类型的值分配给另一种类型的对象而犯错误。这样的程序不是允许在运行时发生任意事情,而是格式错误(除非一种类型可以隐式转换为另一种类型;情况并非如此)。

在这种情况下,您尝试将整数分配给指针。这样的操作很不寻常,必须将整数类型的值显式转换为指针指针类型。

我试图理解为什么一旦将特定地址存储在指针中,就必须以不同的方式存储新地址:

*y = 0x61fe9d;

这不会在指针中存储地址,即不会使指针指向另一个内存位置。您使用间接运算符(一元*)间接通过指针,因此表达式的值是指向的对象,而不是指针本身。

要更改指针的值,请不要间接通过它:

y = address_of_another_object;
*y = (int*) 0x61fe9d;

编译器给了我invalid conversion from 'int*' to 'int'的错误。

就像上面一样,类型系统阻止您将一种类型的值分配给另一种类型的对象,除非在另一个方向。在这种情况下,您尝试将指针值分配给整数对象。

由于您的意图似乎不是修改指向的对象,因此类型系统似乎使您免于犯错。


PS 通过指针间接访问内存的行为是未定义的,除非您在那里创建了一个对象。除非您分配了内存,否则您无法在任意内存位置创建对象。并且没有在任意位置分配内存的标准方法。

据我所知,通过将整数文字间接转换为指针的唯一情况是一些嵌入式系统,其中记录的地址与硬件进行通信。在这种情况下,您可能需要将指向的类型限定为volatile.


推荐阅读