struct tag//结构体标签
{
member-list;//成员列表
}variable-list;//变量列表
举个例子:描述一个学生
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
注意结尾的分号不能丢
struct//这里只有关键字
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
struct Node
{
int data;
struct Node next;
};
struct Node
{
int data;
struct Node* next;
};
typedef struct Node
{
int data;
struct Node* next;
}Node;
注意:这个和结构体全局变量不一样
struct Node
{
int data;
char ch;
}node;
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义全局变量p1
int main()
{
struct Point p2; //定义结构体局部变量p2
}
struct Stu //类型声明
{
char ch;
int age;
};
struct Stu s1 = {'h', 20};//初始化,按顺序进行初始化
struct Stu s2 = {.ch='h',.age=20};//不关心顺序
struct Point
{
int x;
int y;
}p1;
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化,注意大括号位置
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S2));
以后定义多个成员变量时注意一下
#pragma pack(8)//设置默认对齐数为8
struct S1
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
计算下面代码所占空间大小
#pragma pack(1)//设置默认对齐数为1
struct S2
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
int main()
{
//输出的结果是什么?
printf("%d\n", sizeof(struct S1));
return 0;
}
结构在对齐方式不合适的时候,我们可以自己更改默认对齐数,但也不要随便使用,一般设置2的n次方,设置不合适反而降低效率
struct S
{
int data[1000];
int num;
};、
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)//如果不想修改s的值,在形参前面加const修饰
{
printf("%d\n", ps->num);
}
int main()
{
struct S s = {{1,2,3,4}, 1000};
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
结构体传参的时候,要传结构体的地址
struct A
{
int a:2;
int b:5;
int c:10;
int d:30;
};
这个数字代表所占变量的二进制位
举例说明
struct S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
struct S s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
//空间是如何开辟的
跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。
以上代码仅供参考 如有错误请大家指点 我会尽快去改正 欢迎大家来评论~~~