如何在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;