C++ 强制转换用作指针的常量

C++ 强制转换用作指针的常量,c++,casting,uint32-t,C++,Casting,Uint32 T,我一直在使用一些在ARM处理器中运行的示例代码。为了读取一个特定的内存位置,它将一个常量值强制转换为一个地址 例如: 我们希望读取0xa0000000的内存值 示例代码如下所示: uint32_t test_data; const uint32_t test_address = 0xa0000000; test_data = *(uint32_t*) test_address; 我不太了解演员阵容*(uint32\u t*)。在我看来,只要一个*就足够了 我希望你能解释一下 谢谢。强制转换

我一直在使用一些在ARM处理器中运行的示例代码。为了读取一个特定的内存位置,它将一个常量值强制转换为一个地址

例如:

我们希望读取0xa0000000的内存值

示例代码如下所示:

uint32_t test_data;

const uint32_t test_address = 0xa0000000;

test_data = *(uint32_t*) test_address;
我不太了解演员阵容*(uint32\u t*)。在我看来,只要一个*就足够了

我希望你能解释一下

谢谢。

强制转换
(uint32\u t*)测试地址
测试地址
的值重新解释为地址,并生成指向该地址的指针。此C-cast具有与重新解释cast相同的效果,实际上,应该使用重新解释cast

要获取指针也指向的值,即其指针对象,必须通过
*
取消对其的引用。这为我们提供了
*((uint32\u t*)test\u address)
,或者等价地
*(uint32\u t*)test\u address
,强制转换
(uint32\u t*)test address
test\u address
的值重新解释为一个地址,并生成指向该地址的指针。此C-cast具有与重新解释cast相同的效果,实际上,应该使用重新解释cast

要获取指针也指向的值,即其指针对象,必须通过
*
取消对其的引用。这为我们提供了
*((uint32\u t*)test\u address)
,或者等价地
*(uint32\u t*)test\u address
,强制转换
(uint32\u t*)test address
test\u address
的值重新解释为一个地址,并生成指向该地址的指针。此C-cast具有与重新解释cast相同的效果,实际上,应该使用重新解释cast

要获取指针也指向的值,即其指针对象,必须通过
*
取消对其的引用。这为我们提供了
*((uint32\u t*)test\u address)
,或者等价地
*(uint32\u t*)test\u address
,强制转换
(uint32\u t*)test address
test\u address
的值重新解释为一个地址,并生成指向该地址的指针。此C-cast具有与重新解释cast相同的效果,实际上,应该使用重新解释cast


要获取指针也指向的值,即其指针对象,必须通过
*
取消对其的引用。这为我们提供了
*((uint32\u t*)测试地址)
,或者等效地
*(uint32\u t*)测试地址

您将指针存储为uint32\u t,而不是指向uint32\u t的指针。这就是为什么你必须做额外的演员阵容

我建议如下:

#include <iostream>

int main(int argc, const char** argv) {
    volatile uint32_t* const test_address = reinterpret_cast<uint32_t*>(0xa0000000);
    uint32_t value = *test_address;
    return 0;
}
#包括
int main(int argc,常量字符**argv){
易失性uint32测试*常量测试地址=重新解释转换(0xa0000000);
uint32_t值=*测试地址;
返回0;
}

将指针存储为uint32\t,而不是指向uint32\t的指针。这就是为什么你必须做额外的演员阵容

我建议如下:

#include <iostream>

int main(int argc, const char** argv) {
    volatile uint32_t* const test_address = reinterpret_cast<uint32_t*>(0xa0000000);
    uint32_t value = *test_address;
    return 0;
}
#包括
int main(int argc,常量字符**argv){
易失性uint32测试*常量测试地址=重新解释转换(0xa0000000);
uint32_t值=*测试地址;
返回0;
}

将指针存储为uint32\t,而不是指向uint32\t的指针。这就是为什么你必须做额外的演员阵容

我建议如下:

#include <iostream>

int main(int argc, const char** argv) {
    volatile uint32_t* const test_address = reinterpret_cast<uint32_t*>(0xa0000000);
    uint32_t value = *test_address;
    return 0;
}
#包括
int main(int argc,常量字符**argv){
易失性uint32测试*常量测试地址=重新解释转换(0xa0000000);
uint32_t值=*测试地址;
返回0;
}

将指针存储为uint32\t,而不是指向uint32\t的指针。这就是为什么你必须做额外的演员阵容

我建议如下:

#include <iostream>

int main(int argc, const char** argv) {
    volatile uint32_t* const test_address = reinterpret_cast<uint32_t*>(0xa0000000);
    uint32_t value = *test_address;
    return 0;
}
#包括
int main(int argc,常量字符**argv){
易失性uint32测试*常量测试地址=重新解释转换(0xa0000000);
uint32_t值=*测试地址;
返回0;
}

如果拆分,则更清晰

test_data = *(uint32_t*) test_address;
分成两步

uint32_t  *p = (uint32_t*) test_address;
test_data = *p;

第一个是演员阵容,第二个是取消引用

如果你分开,它会更清晰

test_data = *(uint32_t*) test_address;
分成两步

uint32_t  *p = (uint32_t*) test_address;
test_data = *p;

第一个是演员阵容,第二个是取消引用

如果你分开,它会更清晰

test_data = *(uint32_t*) test_address;
分成两步

uint32_t  *p = (uint32_t*) test_address;
test_data = *p;

第一个是演员阵容,第二个是取消引用

如果你分开,它会更清晰

test_data = *(uint32_t*) test_address;
分成两步

uint32_t  *p = (uint32_t*) test_address;
test_data = *p;

第一个是强制转换,第二个是取消引用(uint32t*)将地址强制转换为指针。但是您不想读取指针值本身(因为您已经得到了它,它是常量)——您想读取指针指向的内存,这是通过使用
*
运算符取消引用指针来实现的。
*op
如果x是整数类型,则没有意义(编译器错误)。如果
op
是一个指针,它就有意义了:它是解引用操作器,它解引用指针
op
。由于
test\u data
是整数类型,因此需要对指针进行强制转换。
(uint32t*)
将地址强制转换为指针。但是您不想读取指针值本身(因为您已经得到了它,它是常量)——您想读取指针指向的内存,这是通过使用
*
运算符取消引用指针来实现的。
*op
如果x是整数类型,则没有意义(编译器错误)。如果
op
是一个指针,它就有意义了:它是解引用操作器,它解引用指针
op
。由于
test\u data
是整数类型,因此需要对指针进行强制转换。
(uint32t*)
将地址强制转换为指针。但是您不想读取指针值本身(因为您已经得到了它,它是常量)——您想读取指针指向的内存,这是通过使用
*