这个表达式的意思是,把a强制转换为it*型。
不过it并不是C语言中的标准类型,在这里可能是int的误写,也可能是一个自定义类型it。
不过是哪种形式并不影响对这个表达式的理解。
(type *)expr形式,含义为
把表达式expr(可以是一个变量,也可以是一个表达式的结果)转为type *型。
一般这类转换的作用都是赋值给一个type *型的变量,或者直接对其取地址。下面以int*型分别举例说明。
1 赋值形式。
实例代码如下:
#include
void func(int *a, int len)
{
//do something
}
int main()
{
int a[2][2] = {{1,2},{3,4}};
int *p;
p = (int *)a;
func(p, 4);
return 0;
}
这是一个很常见的把二维数组降维到一维指针处理的情况。
p=(int *)a;就是之前说的赋值形式。
这里也可以简化为不用中间变量p的形式,即
func((int *)a, 4);
效果是一样的。
2 直接取值。
其实上一个例子中,简化掉中间变量后,就已经是直接取值的一种形式了。
还有一种常见的形式是这样的:
#include
int main()
{
char str[] = {0x00, 0x00, 0x00, 0x12};
printf("^%d\n", *((int *)str));
}
这里把字符数组str强制转换为int*型并取值,然后对其按照整型进行输出。
综上所述,强制转换为某种指针的作用就是把转换结果当做该指针来用。应用可能多种多样,但其原理都是相同的。
首先GPIOA_BASE是一个地址,这个地址是你可以直接访问的。((GPIO_TypeDef *) GPIOA_BASE) 则是把GPIOA_BASE这个地址转换成一个GPIO_TypeDef 这个结构体变量的起始地址。也就是一个指向一个GPIO_TypeDef变量 的一个指针。
这样就很容易对GPIOA_BASE之后的一系列寄存器赋值了。
从你的程序来看,比如CRL这个寄存器,它的地址应该就是GPIOA_BASE起始地址,CRH就是GPIOA_BASE+4,依次类推。
现在你可以这样使用。GPIO_TypeDef * pReg = ((GPIO_TypeDef *) GPIOA_BASE);
pReg->CRL = 某值,pReg->CRH = 某值。这样阅读起来方便,自己也不容搞错。
我只是举个例子方便你理解。
是强制转换