一、结构体指针
typedef struct
{
unsigned
long int DATA;
unsigned
long int DIRECTION;
unsigned
long int INTERRUPT_MASK;
unsigned
long int EDGE_CAPTURE;
}PIO_STR;
//define LED Register
#ifdef _LED
#define LED ((PIO_STR *)LED_BASE) //
表示定义了一个PIO_STR的指针,并强制这个指针的值
//为LED_PIO_BASE,意思是定义了一个常量指针,指针类型为PIO_STR
分析:
1. PIO_STR是一个结构体,它是:
typedef struct
{
unsigned long int DATA;
unsigned long int DIRECTION;
unsigned long int INTERRUPT_MASK;
unsigned long int EDGE_CAPTURE;
}
2. PIO_STR *是表示指向这样一个结构体的指针
3. LED_BASE是一个数值:0x00001800,这里代表地址
4. (PIO_STR *) LED_BASE 表示对这样一个地址进行强制转换,使得它变成指向结构体的指针
5. #define LED ((PIO_STR *) LED_BASE)
所以LED是一个值为0x00001800(表示指向地址0x00001800)的,指向一个PIO_STR结构体的指针。地址已经确定,下一步就该在0x00001800这个地址上分配一个具体的PIO_STR结构体了。
注意:LED这个指针永远指向一个地址在0x00001800的结构体。它不能指向其他地方,因而是一个常量指针。但是它可以对指向的结构体进行修改。
二、位域定义
一般在结构体的定义中,我们会见到如下代码:
struct
{
unsigned char
P8OUT0 : 1;
unsigned char
P8OUT1 : 1;
unsigned char
P8OUT2 : 1;
unsigned char
P8OUT3 : 1;
unsigned char
P8OUT4 : 1;
unsigned char
P8OUT5 : 1;
unsigned char
P8OUT6 : 1;
unsigned char
P8OUT7 : 1;
}
P8OUT_bit;
结构体内部的语句
unsigned char P8OUT0 : 1;
表示定义了一个位域,P8OUT0是该位域的域名,而且P8OUT0只占用一个位。
所谓C中的位域,是指信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
具体见转载博文:C语言位域精解