[开发资料] C语言结构体的使用

[复制链接]
171|5
中国龙芯CDX 发表于 2025-10-15 13:50 | 显示全部楼层 |阅读模式
有时候需要将不同类型的数据组合为一个整体,以便于引用。例如,一名学生有学号、姓名、性别、年龄等属性,如果针对每个属性都单独定义一个变量,那么当有多名学生时变量就难以分清。结构体就是用来管理不同类型的数据组合。

结构体的声明与定义
结构体的声明一般形式为:

  1. c
  2. struct 结构体名{
  3.     成员1;
  4.     成员2;
  5.     ...
  6. }; //注意分号

例如:

  1. c
  2. struct student{
  3.     int num;
  4.     char name[20];
  5.     char gender;
  6.     int age;
  7. };

结构体定义:

  1. c
  2. //struct 结构体名 变量名
  3. struct student s;

结构体的初始化只能在定义时进行:

  1. c
  2. struct student s={100,"John",'M',20}; //定义并初始化

如果已经定义了结构体,就不能再初始化了,只能对它的每个成员单独赋值,如s.num=1;

 楼主| 中国龙芯CDX 发表于 2025-10-15 13:52 | 显示全部楼层
结构体成员的访问
采用“结构体变量名.成员名”的形式来访问结构体成员。

  1. c
  2. #include <stdio.h>
  3. //工作中往往把结构体声明放在头文件中
  4. struct student{
  5.     int num;
  6.     char name[20];
  7.     char gender;
  8.     int age;
  9. };

  10. int main() {
  11.     struct student s={100,"John",'M',20}; //定义并初始化
  12.     struct student sarr[3]; //结构体数组
  13.     s.age = 21;
  14.     printf("%d %s %c %d\n",s.num,s.name,s.gender,s.age);
  15.     printf("---------------------\n");
  16.     for (int i = 0; i < 3; ++i) {
  17.         scanf("%d%s %c%d",&sarr[i].num,sarr[i].name,
  18.               &sarr[i].gender,&sarr[i].age);
  19.     }
  20.     for (int i = 0; i < 3; ++i) {
  21.         printf("%d %s %c %d\n",sarr[i].num,sarr[i].name,
  22.                sarr[i].gender,sarr[i].age);
  23.     }
  24.     return 0;
  25. }

执行结果:

2024073-20240114010559421-1163813444.png
 楼主| 中国龙芯CDX 发表于 2025-10-15 13:53 | 显示全部楼层
结构体指针
一个结构体变量的指针就是该变量所占据内存段的起始地址。
结构体指针的使用:

  1. c
  2. #include <stdio.h>

  3. struct student{
  4.     int num;
  5.     char name[20];
  6.     char gender;
  7.     int age;
  8. };

  9. int main() {
  10.     struct student sarr[3]={1,"KK",'F',18,
  11.             2,"HH",'M',20,
  12.             3,"LL",'M',19};
  13.     struct student *p; //定义结构体指针
  14.     p=sarr;
  15.     //获取成员方法一,成员运算符优先级高于取值运算符,所以要加括号(*p).num
  16.     printf("%d %s %c %d\n",(*p).num,(*p).name,(*p).gender,(*p).age);
  17.     //获取成员方法二,更为常用的方法
  18.     printf("%d %s %c %d\n",p->num,p->name,p->gender,p->age);
  19.     printf("---------------\n");
  20.     p=p+1;
  21.     printf("%d %s %c %d\n",p->num,p->name,p->gender,p->age);
  22.     return 0;
  23. }

执行结果:

2024073-20240114010559421-1163813444.png
 楼主| 中国龙芯CDX 发表于 2025-10-15 13:56 | 显示全部楼层
结构体对齐
结构体对齐是为了cpu高效存取内存上的数据。
先运行以下程序观察结构体的大小:

  1. c
  2. #include <stdio.h>

  3. typedef struct A {
  4.     int a;
  5.     char b;
  6.     short c;
  7. }A;

  8. typedef struct B {
  9.     char a;
  10.     int b;
  11.     short c;
  12. }B;

  13. int main() {
  14.     A a;
  15.     B b;
  16.     printf("A size is %d\n",sizeof(a));
  17.     printf("B size is %d\n",sizeof(b));
  18.     return 0;
  19. }

执行结果:
2024073-20240114010559421-1163813444.png


OKAKAKO 发表于 2025-10-19 22:53 | 显示全部楼层
结构体对齐是为了cpu高效存取内存上的数据。
AdaMaYun 发表于 2025-10-23 22:13 | 显示全部楼层
已经定义了结构体,就不能再初始化了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

344

主题

2727

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部