[英]Can someone please explain me this Pointer usage?
我正在学习如何在Linux下为ARM A9编码。 现在,我访问一些外围设备,例如LED。 我的代码实际上正在工作,但是部分基于教程。 我唯一不了解的部分是:
void *virtual_base;
void *led_addr;
void *sw_addr;
int fd;
int switches;
switches=*(uint32_t *)sw_addr;
`
我不明白的部分是为什么我必须写*(uint32_t *)sw_addr;
*sw_addr
表示它是一个变量,它指向一个特定的地址。在我的情况下,它指向特定的外设寄存器,从该地址读取将读取板上的开关状态。 但是呢
*(uint32_t *)sw_addr
是什么意思? 您如何解释它? 为什么我不能写switches= sw_addr
?
如您所见,我有点困惑。
sw_addr是一个void
指针。 不能取消引用void
指针,因为void是非类型类型,即不存在void a;
作为变量声明。 因此,在取消引用之前,将指针uint32_t*
转换为uint32_t*
。 取消引用时,sw_addr地址处的值现在解释为`uint32_t。
编辑:我应该提到您代码中的特定操作可能并不安全,因为您将结果分配给一个int(已签名,而uint32_t
的u代表未签名)。 一个int
可能无法表示存储在uint32_t
的数字,首先是因为unsigned int
可以存储更大的数字,但也可能是因为未保证int
可以保证32位大。
让我们将其分解为以下步骤:
sw_addr
是一个变量。 变量的值为X。 *sw_addr
表示“地址X上的值”,表示我们要读入“开关”的值。 sw_addr
的类型为void *
,因此我们无法编写switches = *sw_addr;
因为编译器不知道您要读取的数据大小。 也许您只想读取一个字节,也许是两个字节,也许是四个? (uint32_t *)sw_addr
告诉编译器将sw_addr
视为指向uint32_t
的指针,这意味着指向无符号32位值的指针。 *((uint32_t *)sw_addr);
(为清楚起见,我添加了另一对括号,但这没关系)表示我们的(uint32_t *)sw_addr
指针所指向的值,即地址X处的4字节无符号值。 switches=*(uint32_t *)sw_addr;
很明显,我们打算从地址X读取4个字节到switches
。 或者,我们可以编写以下内容:
uint32_t *sw_addr;
int switches;
switches=*sw_addr;
“傻瓜”答案:
*(uint32_t *)sw_addr means?
这意味着,请给我uint32_t
来自sw_addr
指向的数据(32位)。
How do you interpret it?
void *sw_addr
指向未知大小的东西,它是一个void pointer
。 将其uint32_t
转换为uint32_t
指针可以告诉我们它指向一个32bit unsigned integer
。 然后,当我们需要数据时,我们得到32 bits
(假设所有强制类型转换都是正确的并且可以进行)。
Why I just cant write switches= sw_addr?
假设您的意思是switches = *sw_addr
,那是因为这就像说:从指针sw_addr
给我未知数量的数据(我们也不知道其指向的类型)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.