结构体

结构体:结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。

ⅰ复合性:结构体单元可以储存不同数据类型。
ⅱ是一种自定义类型。
ⅲ使用:定义类型——>通过类型分配结构体单元——>使用单元。

 
 
  • 1
  • 2
  • 3
  • 4

1)声明机构体类型:

struct 结构体名{                    
    数据类型 成员1;
    数据类型 成员2;
    .....
};

说明:①该定义为类型定义。如:int x;
     ②类型名:struct 结构体名

例:struct stu{
        int x;
        double y;
        char z;
    };
    机构体名:struct stu
    大小:sizeof(struct stu);其大小不为4+8+1
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

说明:空类型的实例中不包括任何信息,本来求sizeof应该为0,但,声明该类型的实例的时候,它必须在内存中占一定的空间,否则无法使用这些实例,至于占多少内存由编译器决定。

2)通过类型声明变量

struct 机构体名 变量;
______类型______

例:struct stu s1,s2;
 
 
  • 1
  • 2
  • 3
  • 4

3)通过机构体变量,引用其成员

方法:结构体变量名.成员
"."成员运算符------>优先级同:[](最高)
例:S1.X=3;
   S1.y=5.7;
   S1.z='A';
   S1=3;其类型不匹配

例:将机构体变量S1每一个分量赋值给机构体变量S2
    S2.x=S1.x;
    S2.y=S1.y;
    S2.z=S1.z;
    若两者类型匹配,则两者可以直接赋值,即S2=S1
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4)声明结构体指针变量,指向机构体变量

struct 结构体名 *指针变量;
例:struct stu *p;

ⅰ.指针变量有指向
    指针变量=&结构体变量
    例: p=&S1; p=&S2;
ⅱ.通过指针引用结构体成员
    指针变量->成员名
    例:struct stu  S1;
    struct stu *p;
    p=&S1;
    S1.x=3;    p->x=3;
    S1.y=5.7;  p->y=5.7;
    S1.z='A'   p->z='A';

    证明:S1.x==>*&S1.x;
             ==>*p.x;
             ==>p->x;
    指针->成员==(*指针).成员         
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

5)结构体数组的定义

struct 结构体名  数组名[个数];
例:struct stu S[5];
 
 
  • 1
  • 2

6)例:设学生信息 学号,姓名,数学成绩,英语成绩,语文成绩,通过键盘输入每个学生信息。

#include<stdio.h>
#include<string.h>
#define N 2
struct stu{
    int id;
    char name[20];
    int math;
    int English;
    int Chi;
};
int main(void)
{
    struct stu s[N];
    double sumM=0,sumE=0,sumC=0;
    for(int i=0;i<N;i++)
    {
        s[i].id=i+1;
        printf("输入第%d位学生姓名:",i+1);
        fflush(stdin);//gets不接收“回车”,清除缓冲区中残留的“回车”
        gets(s[i].name);
        printf("输入第%d位学生三门成绩:",i+1);
        scanf("%d%d%d",&s[i].math,&s[i].English,&s[i].Chi);
    }
    Average(s,&sumM,&sumE,&sumC);
    printf("%.2f %.2f %.2f",sumM,sumE,sumC);
    return 0;
}
ⅰ.求个门成绩的总分
void Average(struct stu s[],double *sumM,double *sumE,double *sumC)
{
    for(int i=0;i<N;i++)
    {
        (*sumM)+=s[i].math;
        (*sumE)+=s[i].English;
        (*sumC)+=s[i].Chi;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI改变我的未来

不多不少5C币是你我沟通的桥梁

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值