C语言5:结构体 您所在的位置:网站首页 结构体函数c语言 C语言5:结构体

C语言5:结构体

2023-06-06 11:09| 来源: 网络整理| 查看: 265

目录

一 基本概念

二 结构体数组

三 应用:选票系统

需求:结构体包括姓名和票数,用户可以输入每个选民的名字来定义结构体,再逐次输入名字进行投票(唱票环节),最后输出当选者及其票数,还有弃票的数量(这里代码就不写了,业务逻辑蛮清晰的)

四 结构体指针

五 结构体函数

六 共用体/联合体

1.概念

2.应用:老师有姓名职业科目,学生有姓名职业班级,用结构体+共用体表达

七 枚举类

八 typedef关键字

一 基本概念

有点像java里的类的概念,可以用点运算符进行赋值,或者定义时大括号直接赋值

定义结构体时要和定义全局变量时一样加上“;”不同于函数

另外这里拓展了用字符串数组存汉字的方法:

#include #include struct Student{ //char name[16] = "yzq";//不可以在结构体里赋值 char name[16]; char gender[3];//char类型大小只有一字节,一个汉字本身占2字节,且另外需要一个'\0' int age; char QQ[16]; }; int main(){ //定义一个student struct Student student; //两种赋值方式 struct Student student1 = {"YuZhaoQun","男",22,"2698271719"}; //另一种 strcpy(student.name,"wrx"); strcpy(student.gender,"女"); student.age = 3; strcpy(student.QQ,"1476062109"); printf("%s\n%s\n%d\n%s\n", student1.name,student1.gender,student1.age,student1.QQ); printf("%s\n%s\n%d\n%s\n", student.name,student.gender,student.age,student.QQ); return 0; }

运行结果:

YuZhaoQun 男 22 2698271719 wrx 女 3 1476062109

二 结构体数组

形式类似二维数组

#include #include struct Student{ char name[16]; char gender[3]; int age; }; int main(){ //结构体数组 struct Student arr[3] = {{"a","男",16},{"b","女",18},{"c","男",21}}; int len = sizeof(arr)/sizeof(arr[0]); for(int i = 0;i < len;i++){ printf("%s\n%s\n%d\n", arr[i].name,arr[i].gender,arr[i].age); } return 0; } 三 应用:选票系统 需求:结构体包括姓名和票数,用户可以输入每个选民的名字来定义结构体,再逐次输入名字进行投票(唱票环节),最后输出当选者及其票数,还有弃票的数量(这里代码就不写了,业务逻辑蛮清晰的)

注意:唱票环节因为循环输入字符串时,不能确定每个名字长度一致,如:第一次输入“abc”第二次输入“mn”,那么第二次不清空字符串就直接读取的结果实际上是“mnc”,所以使用:

menset(String,'\0',sizeof(String)); 四 结构体指针

换汤不换药

结构体指针变量用 -> 运算符,而不用 点运算符

#include struct Test{ int Id; int Data; }; int main(){ struct Test test = {1,314}; struct Test *p = &test; //变量名访问,用点访问 printf("test:Id = %d\tData = %d\n",test.Id,test.Data); //变量名访问,用->访问 printf("*p:Id = %d\tData = %d\n",p->Id,p->Data); p->Data = 273; printf("test:Id = %d\tData = %d\n",test.Id,test.Data); printf("*p:Id = %d\tData = %d\n",p->Id,p->Data); return 0; }

再自己试试二维指针

用结构体指针改写一下“三 应用:选票系统”

五 结构体函数

不多解释,小心野指针

#include struct Test{ int Id; int Data; }; struct Test* put(struct Test *p){ int Id; int Data; puts("请输入Id,和Data的值"); scanf("%d%d",&Id,&Data); p->Id = Id; p->Data = Data; return p; } void get(struct Test *p){ printf("*p:Id = %d\tData = %d\n",p->Id,p->Data); } int main(){ struct Test test; struct Test *p = &test; p = put(p); get(p); return 0; }

用函数继续改写一下“三 应用:选票系统”使其简洁一些

六 共用体/联合体 1.概念

像结构体但是有区别

结构体内存空间确定,每种变量已经分配好了内存

共用体一片混沌,一片储存空间里不一定存放的那种数据类型的变量

#include struct TestS{ int Id; int Data; }; union TestU{ int Id; int Data; }; int main(){ struct TestS s1 = {1,314}; union TestU u1; //不能这样定义 不然输出 2,2 //union TestU u1 = {2,273}; //数值覆盖了,照样不对,273,273 //u1.Id = 2; //u1.Data = 273; //两变量在不同内存地址 printf("s1:\nId in 0x%p\nData in 0x%p\n",&s1.Id,&s1.Data); //两变量在同一内存地址 printf("u1:\nId in 0x%p\nData in 0x%p\n",&u1.Id,&u1.Data); printf("s1:\nId = %d\tData = %d\n",s1.Id,s1.Data); printf("u1:\nId = %d\tData = %d\n",u1.Id,u1.Data); return 0; }

输出结果:

t1: Id in   0x000000000061FE18 Data in 0x000000000061FE1C u1: Id in   0x000000000061FE14 Data in 0x000000000061FE14

2.应用:老师有姓名职业科目,学生有姓名职业班级,用结构体+共用体表达 #include struct Person{ char name[16]; char career; union{ int class; char subject[16]; }mes; }; int main(){ struct Person p[2]; int i; for(i = 0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有