struct tag//结构体名
{
member-list;
//结构体成员
}variable-list;//结构体变量名
例如:
struct member
{
char name[100];//名字
int age;//年龄
char gender[10];//性别
};
#include
struct member
{
char name[100];//名字
int age;//年龄
char gender[10];//性别
};
int main()
{
//按结构体成员顺序初始化
struct member m1 = { "张三",23,"male" };
printf("%s\n", m1.name);
printf("%d\n", m1.age);
printf("%s\n", m1.gender);
//按指定顺序初始化
struct member m2 = { .age = 21,.gender = "female",.name = "李四" };
printf("%s\n", m2.name);
printf("%d\n", m2.age);
printf("%s\n", m2.gender);
return 0;
}
结构体自引用的含义是结构体成员可以是结构体类型指针。如链表:
struct Node
{
int data;
struct Node* next;//结构体类型指针;
};
注意:不可是以下情况
struct Node
{
int data;
struct Node next;
};
最大对齐数是4,所以结构体S1的大小是4的倍数刚好为8。
struct S2
{
char a;//1
int b;//8
short c;//2
};
int main()
{
printf("%zd\n", sizeof(struct S2));
return 0;
}
结构体S2和S1仅是成员顺序的不同,但大小却不相同。S2最大对齐数是4,所以S2大小是4的倍数为12。
大家可以用这种画图的方式来理解结构体对齐规则。
#include
struct S
{
int data;
int num;
};
void Print(struct S* s)
{
printf("%d\n", s->data);
printf("%d\n", s->num);
}
int main()
{
struct S s1 = { 10,20 };
Print(&s1);//指针传参
return 0;
}
如:
struct A
{
int _a : 2;
int _b : 3;
int _c : 10;
};
struct S
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
};
int main()
{
struct S s = { 0 };
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
return 0;
}
总结:
struct A
{
int _a : 2;
int _b : 3;
int _c : 10;
};
int main()
{
struct A sa = { 0 };
scanf("%d", &sa._a);//错误示范
//正确示范
int a = 0;
scanf("%d", &a);
sa._a = a;
return 0;
}