为什么这个宏体中存在类型转换?

时间:2017-12-14 11:02:50

标签: c embedded microcontroller memory-address

我学习计算机工程,这里的老师总是告诉我们这样定义一个μC地址:

#define FIO0DIR (* (unsigned int *) 0x2009C000) //GPIO direction register from the lpc1769

但他们从未真正解释过为什么或正在发生什么。

所以我的问题是:为什么演员阵容呢?

3 个答案:

答案 0 :(得分:5)

  

为什么演员阵容?

因为0x2009C000是一个整数常量。不是地址。即使目标体系结构可能不是,C类型系统也会将整数与地址区分开来。它允许对它们进行各种约束的转换,但这两种类型是同一个。

您需要使用强制转换将积分常量转换为正确的指针类型,因此您可以取消引用它并访问该地址处的内容。

答案 1 :(得分:0)

引用C11,§6.5.3.2,地址和间接运营商

  

一元*运算符的操作数应具有指针类型。

就它而言,0x2009C000是一个整数常量(如第6.4.4.1章所述),而不是指针类型。

但是,由于我们打算将此整数常量用作地址,并且需要使用地址来获取值,因此可以使用强制转换。

转换告诉编译器将整数常量值视为指向unsigned int的指针,然后,取消引用操作符作用于指针以获取存储的值在那个记忆位置。

请注意,不要将此视为一般适用性。整数常量值是否可以表示(有效)地址位置,在很大程度上取决于平台和环境。

答案 2 :(得分:0)

您所知道的是您的控制器映射到地址0x2009C000,但要操作它,您需要定义要在该地址存储或读取的数据类型。这就是C等高级语言中的类型:指定在某个地址存储的数据类型,长度(以字节为单位)及其表示形式(例如2&#39的补码中的整数)。所以:

(unsigned int *)0x2009C000

表示将常量0x2009C000视为存储无符号整数的地址。

* ((unsigned int *)0x2009C000)

表示存储在存储无符号整数的地址的变量,只是存储在给定地址的无符号整数变量