繁体   English   中英

有人可以给我解释一下Pointer的用法吗?

[英]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位大。

让我们将其分解为以下步骤:

  1. sw_addr是一个变量。 变量的值为X。
  2. 在内存中,地址X位于您要读取到变量“ switchs”中的一些32位(4字节)值。
  3. *sw_addr表示“地址X上的值”,表示我们要读入“开关”的值。
  4. 由于sw_addr的类型为void * ,因此我们无法编写switches = *sw_addr; 因为编译器不知道您要读取的数据大小。 也许您只想读取一个字节,也许是两个字节,也许是四个?
  5. 强制转换(uint32_t *)sw_addr告诉编译器将sw_addr视为指向uint32_t的指针,这意味着指向无符号32位值的指针。
  6. 语句*((uint32_t *)sw_addr); (为清楚起见,我添加了另一对括号,但这没关系)表示我们的(uint32_t *)sw_addr指针所指向的值,即地址X处的4字节无符号值。
  7. 进行适当的转换后,我们可以编写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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM