在C语言中将一个类型化的int指针分配给一个类型化的指针地址?

在C语言中将一个类型化的int指针分配给一个类型化的指针地址?,c,pointers,casting,C,Pointers,Casting,我不知道我问的问题是否正确,但我一直在努力思考下面几行代码,无法找到我能理解的答案 #define GPIO_LED ((uint32_t *)0x510000A0) *(GPIO_LED ) = (uint32_t *)num; 其中num是一个整数(介于0和255之间)好的((uint32_t*)0x510000A0)是指向uint32_t的指针类型的常量——换句话说,是显式声明的绝对地址 *(GPIO_LED)=(uint32_t*)数值type将num中的值强制转换为指向uint3

我不知道我问的问题是否正确,但我一直在努力思考下面几行代码,无法找到我能理解的答案

#define GPIO_LED  ((uint32_t *)0x510000A0)

*(GPIO_LED ) = (uint32_t *)num;
其中num是一个整数(介于0和255之间)

好的
((uint32_t*)0x510000A0)
是指向
uint32_t
的指针类型的常量——换句话说,是显式声明的绝对地址

*(GPIO_LED)=(uint32_t*)数值
type将num中的值强制转换为指向
uint32\u t
的指针,然后将其分配到具有绝对地址的位置
0x510000A0

其效果是,它将值
num
放入程序的内存空间中的地址
0x510000A0

这种技巧通常用于低级编程,将设置放入映射到某个物理设备控件的内存地址中

更新


是的,是的,我迷路了
uint32\u t
指针。

第二行应该是
*(GPIO\u LED)=(uint32\u t)num,额外的
*
是一个错误。(取决于编译器和平台的详细信息,代码在使用或不使用star时可能会以相同的方式运行,但正确的版本不是star)。感谢您的澄清。根据下面的评论,我只想指出,这显然是源于现有的工作代码,演员阵容是
uint32\u t*
。这实际上是原程序员的一个相当微妙的错误。感谢您的回复。所以要明确的是,num的类型转换中的星号很可能是一个错误吗?很可能,但不一定。
*(GPIO_LED)
的类型是
uint32_t
,因此它指的是
0x510000A0
位置处的
uint32_t
值。通常情况下(我认为它的意思是名称是
num
,而不是
ptr
)是将数字放在那个绝对位置。然而,程序员可能是想把
num
当作地址。它不会通过lint,我怀疑您会得到编译时警告,但至少在C中,我认为它会编译。鞠躬,如果是这样的话,我认为程序员应该被打败。在我从中获取的代码中,num被声明为uint32_t而不是指针(范围仅为0到255)。既然是这样,C编译器会不会忽略星号?我假设是这样的,因为程序成功编译并按预期运行。如果num被视为地址,程序将不会按预期运行