C语言:2026.1.28(结构体)

1.结构体的声明
srtuct 名字
{
成员;
};
2.初始化:
struct student stu1={1,20,"zhangsan",{90,95,85}}; 可以不完全初始化
struct student stu1={。name="zhangsan"};
3.对于结构体类型重命 名typedef struct student student;
4.typedef struct student
{
}student;
5.匿名结构体,声明的时候没有起名字;
typedef struct
{
int id;
char name[20]
}S;
int main()
{
s1.id=1;
strcpy(s1.name,"zhangsan");
S a1={1,"zhangsan"};
return 0;
}
6.总结
(1)声明结构体类型时可以定义变量;
(2)声明结构体类型可以重命名;
(3)匿名结构体,要重命名,声明时定义变量;
7.嵌套结构体类型:结构体中可以有结构体;
8.结构体类型的自引用;
struct student
{
int age;
struct student *pstu;
}
9.结构体指针访问成员用->
10.结构体大小:
11.内存对齐:牺牲空间,换取时间;
12.#include<stddef.h>;
offsetof(struct S4,c1);
13.较小的成员放一起;节省内存;
14.修改默认对齐数;

pragma pack(1);

pragma pack();还原;

15.最好传指针,节省内存;
作业:
1.声明结构体类型;
struct student
{
char name[20];
int age;
}stu1;
2.初始化
struct student stu2;
struct student stu3 ={"zhangsan",18};
struct student stu4={.age=20,.name="lisi"};
3.访问;
直接访问:
struct Point
{
int x;
int y;
}p={1,2};
int main()
{
printf("x=%d,y=%d",p.x,p.y);
return 0;
}
间接访问:
struct Point{
int x;
int y;
};
int main()
{
struct Point p={1,2};
struct Point* ptr=&p;
printf("x=%d,y=%d",ptr->x,ptr->y);
}
4.计算结构体大小;
struct S1
{
char c1;
int i;
char c2;
};
//12
struct S2
{
char c1;
char c2;
int i;
};
//8
struct S3
{
double d;
char c;
int i;
};
//16
struct S4
{
char c1;
struct S3 s3;
double d;
};
//32
5.为什么内存对齐;平台 性能;
1.平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址
处取某些特定类型的数据,否则抛出硬件异常。
2.数据结构应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次
内存访问;而对齐的内存访问仅需要一次访问。
假设一个处理器总是从内存中取8个字节,则地址必须是8的倍数。如果我们能保证将所有的double
类型的数据的地址都对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。否则,我们可能
需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中
3.所以结构体的内存对齐是拿空间来换取时间的做法,提高效率
那所以我们在定义结构体的时候尽可能让小内存成员放在一起;

posted @ 2026-01-30 13:35  白白0419  阅读(5)  评论(0)    收藏  举报