有关此问题的有趣讨论开始here,但没有人能够提供C ++方法:
#include <stdio.h>
int main(void)
{
int* address = (int *)0x604769;
printf("Memory address is: 0x%p\n", address);
*address = 0xdead;
printf("Content of the address is: 0x%p\n", *address);
return 0;
}
在C ++中使用这种方法最合适的方法是什么?
答案 0 :(得分:22)
在C ++中,总是比C-cast更喜欢reinterpret_cast
。它太丑了,有人会立即发现危险。
示例:
int* ptr = reinterpret_cast<int*>(0x12345678);
那件事伤害了我的眼睛,我喜欢它。
答案 1 :(得分:1)
没有标准和便携的方法。非可移植方式可能包括reinterpret_cast(someIntRepresentingTheAddress)。
答案 2 :(得分:1)
这将有效:
void *address=(void *) 0xdead; // But as mentioned, it's non-standard
address=(void *) 0xdeadbeef; // Some other address
答案 3 :(得分:1)
在C ++中,我更喜欢将指针声明为头文件中的常量指针:
volatile uint8_t * const UART_STATUS_REGISTER = (uint8_t *) 0xFFFF4000;
在C语言中,这通常使用宏来实现:
#define UART_STATUS_REGISTER ((volatile uint8_t * const) 0xFFFF4000)
在其余的源代码中,内存地址通过符号名称引用。
答案 4 :(得分:1)
我想补充一点,如果你想要在指定地址分配它时调用一个对象构造函数,你可以调用placement操作符:
int *pLoc = reinterpret_cast<int*>(0x604769);
int *address = new (pLoc) int (1234); // init to a value
这也用于内存缓存对象。创建一个缓冲区,然后为其分配一个对象。
unsigned char *pBuf = new unsigned char[sizeof(CMyObject) + alignment_size];
allign_buf(pBuf);
CMyObject *pMyObj = new (pBuf) CMyObject;