嵌入式之结构体,结构体指针
## 结构体定义
typedef struct
{
unsigned char slot; //°å¿¨²Ûλ
unsigned char port_num; //°å¿¨¶Ë¿ÚÊý
unsigned char PN[30]; //°å¿¨PNºÅ
unsigned char SN[30]; //°å¿¨SNºÅ
unsigned char SW_Version[16]; //°å¿¨Èí¼þ°æ±¾
unsigned char HW_Version[16]; //°å¿¨Ó²¼þ°æ±¾
unsigned char cpld_version[16]; //°å¿¨CPLD°æ±¾
ETHENET_ADDRESS_T ethernet;
unsigned char card_type; //ST_CARD_TYPE_E
unsigned char state; //ST_CARD_STATE_E
INT16 temp_airin;
INT16 temp_airout;
unsigned char sub_card_type; //ST_SUB_CARDTYPE_E
}CARD_MUX_INFO_T;
## 声明一个结构体
CARD_MUX_INFO_T *card_info = get_card_info();
如何获取结构体card_info成员的地址
在C语言中,.
和->
都是用于访问结构体成员的运算符,但它们的使用场景略有不同。
.
运算符用于访问结构体变量的成员,而->
运算符用于访问指向结构体的指针的成员。
例如,假设有以下结构体定义:
typedef struct {
int age;
char name[20];
} Person;
如果我们有一个Person类型的结构体变量person,我们可以使用.
来访问其成员:
Person person;
person.age = 25;
strcpy(person.name, "John");
如果我们有一个指向Person类型的指针ptr,我们可以使用->
来访问其成员:
Person *ptr = &person;
ptr->age = 30;
strcpy(ptr->name, "Alice");
在这个例子中,ptr->age
和ptr->name
分别访问了指针ptr所指向的结构体的成员age和name。
因此,.
用于直接访问结构体变量的成员,而->
用于访问指向结构体的指针的成员。
实例补充
typedef struct
{
UI16_T bcm5482_rst:1,
idt_rst:1,
retimer_rst:1,
si5342_rst:1,
resv:12;
}st_retimer_card_rst_t;
st_retimer_card_rst_t retimer_rst = {0};
st_retimer_card_rst_t retimer_rst = {0};结构体等于{0}是什么意思
在C语言中,当你使用{0}
来初始化一个结构体变量时,这意味着你希望将该结构体的所有成员都设置为0或者对应类型的默认值。
在给定的例子中,st_retimer_card_rst_t
是一个包含多个位域成员的结构体,通过{0}
初始化,将会将所有的成员都设置为0。对于位域成员,这意味着将它们的值都设置为0,对于整型成员,也会将它们的值都设置为0。
这样的初始化在很多情况下是非常有用的,特别是当你希望确保结构体的所有成员都被初始化为默认值的时候。
结构体冒号:后面是什么意思
在这个结构体定义中,冒号后面的数字表示了每个成员的位域长度。例如,bcm5482_rst
、idt_rst
、retimer_rst
和si5342_rst
都是1位长的位域,而resv
是12位长的位域。
使用位域允许你在一个结构体中定义按位存储的成员,这样可以更加节省内存空间。这在嵌入式系统或者需要精细控制内存布局的系统中会很有用。然而,需要注意的是,位域的行为在不同的编译器和平台上可能会有所不同,因此在使用时需要谨慎考虑。在这个结构体定义中,冒号后面的数字表示了每个成员的位域长度。例如,bcm5482_rst
、idt_rst
、retimer_rst
和 si5342_rst
都是1位长的位域,而 resv
是12位长的位域。
使用位域允许你在一个结构体中定义按位存储的成员,这样可以更加节省内存空间。这在嵌入式系统或者需要精细控制内存布局的系统中会很有用。然而,需要注意的是,位域的行为在不同的编译器和平台上可能会有所不同,因此在使用时需要谨慎考虑。