如何在C ++中初始化指向特定内存地址的指针

可能重复:
指向特定固定地址的指针

关于这一点的有趣讨论从这里开始,但没有人能够提供C ++的方式:

#include  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 ++中最合适的方法是什么?

在C ++中,总是喜欢在C-cast上使用reinterpret_cast 。 它太丑了,有人会立即发现危险。

例:

 int* ptr = reinterpret_cast(0x12345678); 

那件事伤了我的眼睛,我喜欢它。

这样做没有标准和便携的方式。 非可移植方式可能包括reinterpret_cast(someIntRepresentingTheAddress)。

这将有效:

 void *address=(void *) 0xdead; // But as mentioned, it's non-standard address=(void *) 0xdeadbeef; // Some other address 

在C ++中,我更喜欢将指针声明为头文件中的常量指针:

 volatile uint8_t * const UART_STATUS_REGISTER = (uint8_t *) 0xFFFF4000; 

在C语言中,这通常使用宏来实现:

 #define UART_STATUS_REGISTER ((volatile uint8_t * const) 0xFFFF4000) 

在其余的源代码中,内存地址通过符号名称引用。

我想补充一点,如果你想要一个在指定地址分配它时调用的对象构造函数,你可以调用placement操作符:

 int *pLoc = reinterpret_cast(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;