02 结构体

1|0一、结构体

1|01、结构体的声明与定义
  • (1)先声明结构体变量,再定义该类型变量
struct Student{ int num; char name[20]; }; struct Student SU;//定义结构体变量SU

*(2)声明类型的同时定义变量

struct Student{ int num; char name[20]; }student1,student2;
1|02、结构体变量的初始化和引用

(1)在定义结构体变量时可以对它初始化

struct Student{ int num; char name[20]; char sex; char age; char addr[30]; }student1={10001,"Li Lin",'M',22,"Beijing Road"}; struct Student student2={.name="Zhang Fang"};//C99标准允许对某一成员初始化

(2)结构体成员的引用
结构体变量的地址主要作函数参数,传递结构体变量的地址。
student1.成员名表示访问结构体的成员。

//结构体变量访问成员 student1.count=100; student1.name="ZhangSan"; //结构体指针访问成员 su->count=90; su->name="LiSi";
1|03、结构体嵌套
//声明一个结构体类型struct Date struct Date{ int year; //年 int month; //月 int day; //日 }; //声明一个结构体类型struct Student struct Student{ int num; char name[20]; char sex; char age; struct Date Birthday; char addr[30]; };

结构体大小,需注意字节对齐:

1|04、结构体数组

结构体数组每个数组元素都是一个结构体类型的数据,它们分别包括各个成员项。
选举投票统计为例:

#include <stdio.h> #include <string.h> //声明一个struct Person结构体类型并定义一个结构体数组 struct Person{ char name[20]; //候选人姓名 int count; //候选人票数 }leader[3]={"Li",0,"Zhang",0,"Sun",0}; int main() { int i,j; char leader_name[20];//定义字符数组存储被投票人名字 for(i=1;i<=10;i++) { scanf("%s",leader_name); for(j=0;j<3;j++) { if(strcmp(leader_name,leader[j].name) == 0) { leader[j].count++; } else printf("%s 不是候选人 \n",leader_name); } } printf("result:\n"); for(i=0;i<3;i++) { printf("%5s: %d\n",leader[i].name,leader[i].count++); } }

1|05、结构体指针

一个结构体变量的起始地址就是这个结构体变量的指针。
指向结构体对象的指针变量既可指向结构体变量,也可指向结构体数组中的元素,指针变量的基类必须与结构体变量的类型相同。

(1)指向结构体变量的指针

struct Student *su;,定义结构体指针变量su,su可以指向struct Student类型的变量或数组元素。
su->成员名等价于(*su).成员名,括号不可省,运算符“.”优先于“*”。

#include <stdio.h> #include <string.h> //声明一个结构体类型struct Student struct Student{ long num; float score; char name[20]; char sex; }; struct Student SU; //定义struct Student类型变量SU struct Student *su; //定义struct Student类型指针变量su int main() { su=&SU; //结构体指针su指向结构体变量SU SU.num=10000;//对结构体成员变量赋值 strcpy(SU.name,"Li Lin"); //用字符串复制函数给SU.name赋值 SU.sex='M'; SU.score=90.5; printf("No:%ld\nname:%s\nsex:%c\nscore:%5.2lf\n\n",SU.num,SU.name,SU.sex, SU.score); printf("No:%ld\nname:%s\nsex:%c\nscore:%5.2lf\n",(*su).num,(*su).name,(*su).sex,(*su).score); return 0; }

(2)指向结构体数组的指针

  • 有三个学生信息,放在结构体数组中,输出全部学生信息:
    a.声明结构体类型struct Student,并定义结构体数组,同时初始化;
    b.定义一个指向struct Student类型数据的指针变量su;
    c.使su指向结构体数组的首元素,输出它指向的元素中的有关信息;
    d.使su指向结构体数组下一个元素,输出它指向的元素中的有关信息;
    e.再使su指向结构体数组下一个元素,输出它指向的元素中的有关信息;
#include <stdio.h> #include <string.h> //声明一个结构体类型struct Student 32字节 struct Student{ int num; char name[20]; char sex; int age; }; struct Student STU[3]={{10001,"Li Lin",'M',18},{10002,"Zhang Shan",'M',20},{10003,"Wang Min",'F',21}};//定义结构体数组并初始化 struct Student *su; //定义struct Student类型指针变量su int main() { printf("No Name sex age\n"); for (su=STU;su<STU+3;su++)//循环遍历结构体地址 { printf("%5d %-16s%-2c %-2d\n",su->num,su->name,su->sex,su->age); } return 0}

1|06、结构体变量和结构体变量的指针作函数参数

将一个结构体变量的值传递给另一个函数有3个方法:
a.用结构体变量的成员作参数;
b.用结构体变量作参数;
c.用指向结构体变量(或数组元素)的指针作实参。

有N个结构体变量,内含学生学号、姓名和3门课程成绩,要求输出成绩最高的学生的信息,包括学号、姓名、3门课程成绩和平均成绩。

思路:将N个学生的数据表示为结构体数组,封装三个函数。
input函数输入数据和求学生平均成绩;
max函数找平均成绩最高的学生;
print函数输出成绩最高学生的信息。
主函数中先后调用这三个函数,用指向结构体变量的指针作实参。

#include <stdio.h> #define N 3 //学生数量 //声明一个结构体类型struct Student struct Student{ int num; //学号 double score[3]; //3门课平均成绩 float aver; //平均成绩 char name[20]; //姓名 }; //函数声明 void input(struct Student stu[]); struct Student max(struct Student stu[]); void print(struct Student stu); int main() { //定义结构体数组和指针 struct Student stu[N]; struct Student *su; su=stu; input(su); print(max(su)); return 0; } void input(struct Student stu[]) { int i; printf("请输入各学生的的信息:学号 姓名 3门课程成绩\n"); for(i=0;i<N;i++) { scanf("%d %s %lf %lf %lf",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);//输入数据 stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0; //求平均成绩 } } struct Student max(struct Student stu[]) { int i,m=0; //m存放成绩最高的学生在数组中的序号 for(i=0;i<N;i++) { if(stu[i].aver>stu[m].aver) //找出平均成绩最高的学生在数组中的序号 { m=i; } } return stu[m]; } void print(struct Student stu) { printf("\n成绩最高的学生是:\n"); printf("学号:%d\n姓名:%s\n3门课成绩:%5.1f %5.1f %5.1f\n平均成绩:%6.2f\n",stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2],stu.aver); }


__EOF__

本文作者xiaohu
本文链接https://www.cnblogs.com/xiaohuzaixue/p/17738705.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   EternalH  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
点击右上角即可分享
微信分享提示