C++ 以无符号整数存储缓冲区地址;

C++ 以无符号整数存储缓冲区地址;,c++,pointers,C++,Pointers,我有一个内存缓冲区,我想把它的地址存储在一个无符号整数值中 uint8_t* _buff = new uint8_t[1024]; uint64_t* _base_addr = (uint64_t *)_buff; 我希望由_buff或_base_addr指向的位置的地址(无论如何它是相同的位置)存储在say uint32_t值中 所以当我读取整数的值时,它会给我地址。 如何做到这一点?您不能在“say”uint32\u t变量中存储地址,因为地址可能不适合-在64位系统上,指针需要64位存储

我有一个内存缓冲区,我想把它的地址存储在一个无符号整数值中

uint8_t* _buff = new uint8_t[1024];
uint64_t* _base_addr = (uint64_t *)_buff;
我希望由_buff或_base_addr指向的位置的地址(无论如何它是相同的位置)存储在say uint32_t值中

所以当我读取整数的值时,它会给我地址。
如何做到这一点?

您不能在“say”
uint32\u t
变量中存储地址,因为地址可能不适合-在64位系统上,指针需要64位存储。不要固定大小,而是使用C99(
)或C++11(
)的
uintptr\t

要将地址存储在这样的整数变量中,请使用

uintptr_t variable = (uintptr_t)pointer;

不能在“say”
uint32\t
变量中存储地址,因为地址可能不适合-在64位系统上,指针需要64位存储。不要固定大小,而是使用C99(
)或C++11(
)的
uintptr\t

要将地址存储在这样的整数变量中,请使用

uintptr_t variable = (uintptr_t)pointer;

只需施放它:
uint32\u t addr=(uint32\u t)\u buff

不过,你应该有很好的理由这样做,原因有二:

  • 它是不可移植的,甚至可能是错误的-不同系统之间的地址大小不同,通常(但不限于)它将是32位或64位

  • 它会损害代码的可读性。指针的存在正是为了这个原因——存储(和操作)地址


  • 当您需要操作映射到内存中的硬件设备时,可能需要将地址存储为整数。在这种情况下,您需要对自己正在做的事情有一个非常好的了解。

    只需将其转换为:
    uint32\u t addr=(uint32\u t)\u buff

    不过,你应该有很好的理由这样做,原因有二:

  • 它是不可移植的,甚至可能是错误的-不同系统之间的地址大小不同,通常(但不限于)它将是32位或64位

  • 它会损害代码的可读性。指针的存在正是为了这个原因——存储(和操作)地址


  • 当您需要操作映射到内存中的硬件设备时,可能需要将地址存储为整数。在这种情况下,你需要对你正在做的事情有一个非常好的想法。

    你不能可靠地做到这一点;无论您如何努力,64位系统上的指针都无法装入32位无符号整数。可靠的技术是使用
    uintpttr\u t
    存储值:
    uintpttr\u t base=(uintptpttr\u t)buff。此外,使用以下划线为前缀的名称是不确定的——大多数这样的名称都是为实现保留的。那么,为什么不试试
    uint32\u t*\u另一个\u addr=(uint32\u t*)\u buff
    那么??你到底为什么要这样做?一天结束后,你会流泪。因为你使用的是
    new
    ,所以这不能是C,所以我删除了C标记。@Jonathan:你可以使用malloc而不是new。。。传达的想法是缓冲区的分配。你们不能可靠地做到这一点;无论您如何努力,64位系统上的指针都无法装入32位无符号整数。可靠的技术是使用
    uintpttr\u t
    存储值:
    uintpttr\u t base=(uintptpttr\u t)buff。此外,使用以下划线为前缀的名称是不确定的——大多数这样的名称都是为实现保留的。那么,为什么不试试
    uint32\u t*\u另一个\u addr=(uint32\u t*)\u buff
    那么??你到底为什么要这样做?一天结束后,你会流泪。因为你使用的是
    new
    ,所以这不能是C,所以我删除了C标记。@Jonathan:你可以使用malloc而不是new。。。要传达的想法是缓冲区的分配。这正是我正在尝试的。保存某个内存位置地址的硬件寄存器。你在玩弄硬件,不知道如何强制转换,或者指针已经是整数了?!我看不出结局很好……这正是我正在尝试的。保存某个内存位置地址的硬件寄存器。你在玩弄硬件,不知道如何强制转换,或者指针已经是整数了?!我看不出结局很好。。。