我需要帮助如何处理这种情况。变量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_t
或 uintptr_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;