我学习计算机工程,这里的老师总是告诉我们这样定义一个μC地址:
#define FIO0DIR (* (unsigned int *) 0x2009C000) //GPIO direction register from the lpc1769
但他们从未真正解释过为什么或正在发生什么。
所以我的问题是:为什么演员阵容呢?
答案 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)
表示存储在存储无符号整数的地址的变量,只是存储在给定地址的无符号整数变量。