学习C语言的第八天
由于个人的拖拉原因,时隔一周继续更新博客,记录学习。
一.结构体
1.1为什么要用结构体
1.2定义一个结构体
编程习惯要求大写开头
struct Student { int num; char name[32]; char sex; int age; double score; char addr[32]; };
1.3成员列表
也称为域表,每个成员都是结构体中的一个域。
1.4结构体案例
注意:在声明的同时,定义变量,尽量少用
#include<stdio.h>
#include <string.h> struct Student { int num; char name[32]; char sex; int age; double score; char addr[32]; }; int main() { struct Student stu1; stu1.num = 1; stu1.age = 18; stu1.score = 99.9; strcpy(stu1.name,"zhangchaobo"); strcpy(stu1.addr,"内蒙古"); printf("学号:%d,年龄:%d,分数:%.2f,姓名:%s,地址为:%s",stu1.num,stu1.age,stu1.score,stu1.name,stu1.addr); return 0; }
二.结构体数组
相当于二维数组,但是数组里的结构类型可以不一样
#include<stdio.h> #include <string.h> struct Student { int num; char name[32]; char sex; int age; double score; char addr[32]; }; int main() { int len; int i; struct Student arr[3] = { {2,"张三",'y',18,34,"北京"}, {3,"李四",'y',15,45,"南京"}, {4,"王五",'n',17,65,"上海"} }; len = sizeof(arr)/sizeof(arr[0]); for(i=0;i<len;i++){ printf("学号:%d,年龄:%d,分数:%.2f,姓名:%s,地址为:%s,性别:%c\n",arr[i].num,arr[i].age,arr[i].score,arr[i].name,arr[i].addr,arr[i].sex); } return 0; }
练习题:选票系统
#include<stdio.h> #include<string.h> struct XuanMin { char name[32]; int tickets; }; int main() { struct XuanMin xm[3]; int i; int len; int j; int total = 5; char tmpName[32]; int mark = 0; int qTickets = 0; len = sizeof(xm)/sizeof(xm[0]); for(i=0;i<len;i++){ xm[i].tickets = 0; printf("请输入选民的名字:\n"); scanf("%s",xm[i].name); } for(i=0;i<total;i++){ mark = 0; printf("请输入你投给谁:\n"); memset(tmpName,'\0',sizeof(tmpName)); scanf("%s",tmpName); for(j=0;j<len;j++){ if(strcmp(tmpName,xm[j].name) == 0){ xm[j].tickets++; mark = 1; } } if(mark == 0){ printf("没有此人,弃票"); qTickets++; } } for(i=0;i<len;i++){ printf("名字:%s,票数:%d \n",xm[i].name,xm[i].tickets); } printf("弃票为:%d",qTickets); return 0; }
三.结构体指针
通过结构体变量地址来访问该结构体需要一个变量来保持这个地址,这和之前说的指针,其实是一样的,只是指针类型的结构体
#include<stdio.h> struct Test { int idata; char cdata; }; //通过结构体指针访问结构体 int main() { int a = 5; int *pa = &a; char b = 'b'; char *pb = &b; struct Test c = {10,'a'}; struct Test *pc = &c; printf("c的idata为:%d\n",c.idata); printf("pc的idata为:%d\n",pc->idata); return 0; }
引入结构体指针的选票系统
#include<stdio.h> #include<string.h> struct XuanMin { char name[32]; int tickets; }; int main() { struct XuanMin xm[3]; struct XuanMin *p = xm; int i; int len; int j; int total = 5; char tmpName[32]; int mark = 0; int qTickets = 0; len = sizeof(xm)/sizeof(xm[0]); for(i=0;i<len;i++){ p->tickets = 0; printf("请输入选民的名字:\n"); scanf("%s",p->name); p++; } p = xm; for(i=0;i<total;i++){ mark = 0; printf("请输入你投给谁:\n"); memset(tmpName,'\0',sizeof(tmpName)); scanf("%s",tmpName); for(j=0;j<len;j++){ if(strcmp(tmpName,p->name) == 0){ p->tickets++; mark = 1; } p++; } if(mark == 0){ printf("没有此人,弃票\n"); qTickets++; } p = xm; } p = xm; for(i=0;i<len;i++){ printf("名字:%s,票数:%d \n",p->name,p->tickets); p++; } printf("弃票为:%d",qTickets); return 0; }
四.综合函数、结构体、结构体指针的选票系统
#include<stdio.h> #include<string.h> #include <stdlib.h> struct XuanMin { char name[32]; int tickets; }; struct XuanMin* initXms(struct XuanMin *p,int *pn) { int i; if(p == NULL){ printf("请输入有几个人参选: \n"); scanf("%d",pn); p = (struct XuanMin*)malloc(*pn*sizeof(struct XuanMin)); } for(i=0;i<*pn;i++){ p->tickets = 0; printf("请输入选民的名字:\n"); scanf("%s",p->name); p++; } return p-*pn; } void printXms(struct XuanMin *p,int len) { int i; for(i=0;i<len;i++){ printf("名字:%s,票数:%d \n",p->name,p->tickets); p++; } } int doVot(struct XuanMin *p,int len) { int i; int j; int mark; char tmpName[32]; struct XuanMin *pbak = p; int qTickets = 0; for(i=0;i<len;i++){ mark = 0; printf("请输入你投给谁:\n"); memset(tmpName,'\0',sizeof(tmpName)); scanf("%s",tmpName); for(j=0;j<len;j++){ if(strcmp(tmpName,p->name) == 0){ p->tickets++; mark = 1; } p++; } if(mark == 0){ printf("没有此人,弃票\n"); qTickets++; } p = pbak; } return qTickets; } int main() { struct XuanMin *xm =NULL; int total = 0; xm = initXms(xm,&total); printf("sizeof xms = %d\n",total); printXms(xm,total); int qTickets = doVot(xm,total); printf("弃牌数为:%d\n",qTickets); printXms(xm,total); return 0; }
五.联合体/共用体
5.1定义
同一个内存空间存放类型不同,不同类型的变量共享一块空间
5.2和结构体的区别
结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定
结构体元素互不影响 共用体赋值会导致覆盖
#include<stdio.h> #include<string.h> struct TestS { int idata; char cdata; double ddata; }; union TestU { int idata; char cdata; double ddata; }; int main() { struct TestS s1; union TestU u1; printf("结构体s1的大小是:%d\n",sizeof(s1)); printf("联合体u1的大小是:%d\n",sizeof(u1)); return 0; }
六.枚举类型
6.1什么是枚举类型
如果一个变量只有集中可能的值
6.2怎么定义枚举类型
列表中的名字,可以自己定义,无需像变量一样去申请 c编译器把它当成常量处理,也称枚举常量
七.typedef
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)