c - 如何使用指针处理存储在变量中的地址



我需要帮助如何处理这种情况。变量DestinationAddress,包含内存的起始值。我想使用指针来写入数据的地址。可以吗?

例:

long Data32;
long DestinationAddress;
long *temp;
Data32 = 0x00112233;
DestinationAddress = 0x00280000;
temp = DestinationAddress;
*temp = Data32;

当变量声明为:

long Data32;
long DestinationAddress;
long *temp;

您不得使用

temp = DestinationAddress;

您可以使用:

temp = &DestinationAddress;

然后,使用:

*temp = Data32;

是将 DestinationAddress 的值设置为 Data32 的有效方法。

但是,名称DestinationAddress和用于声明它的类型long 似乎不匹配。如果你想让DestinationAddress存储一个long的地址,需要声明为:

long* DestinationAddress;

如果要使用整型而不是long*来存储地址,则要使用的类型为 intptr_tuintptr_t

uintptr_t Data32;
uintptr_t DestinationAddress;
uintptr_t* temp;
Data32 = 0x00112233;
DestinationAddress = 0x00280000;
temp = &DestinationAddress;
*temp = Data32;

更新,以回应OP的评论

您需要使用:

long Data32;
uintptr_t DestinationAddress;
long* temp;
Data32 = 0x00112233;
DestinationAddress = 0x00280000;
temp = (long*)DestinationAddress;
*temp = Data32;

在嵌入式系统中,许多硬件寄存器位于特定地址。 软件需要写入和读取这些地址。

经典(C风格(成语是:

#define USB_STATUS_REGISTER ((uint16_t *) (0x40008250))
uint16_t const * const p_status_register = USB_STATUS_REGISTER;
uint16_t status = *p_status_register;
只要

0x00280000是有效的地址就可以了 - 但你真的应该考虑使用 uintptr_t 来存储指针值(如果可用((而不是在你的示例中long(。

DestinationAddress是一个整数。因此,您需要使用大小写进行转换(否则,编译器可能会发出警告(:

temp = (long*)DestinationAddress;
*temp = Data32;

相关内容

  • 没有找到相关文章

最新更新