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

时间:2010-10-14 15:22:51

标签: c++ c pointers memory casting

  

可能重复:
  pointer to a specific fixed address

有关此问题的有趣讨论开始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 ++中使用这种方法最合适的方法是什么?

5 个答案:

答案 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;