C语言5:结构体 | 您所在的位置:网站首页 › 结构体函数c语言 › C语言5:结构体 |
目录 一 基本概念 二 结构体数组 三 应用:选票系统 需求:结构体包括姓名和票数,用户可以输入每个选民的名字来定义结构体,再逐次输入名字进行投票(唱票环节),最后输出当选者及其票数,还有弃票的数量(这里代码就不写了,业务逻辑蛮清晰的) 四 结构体指针 五 结构体函数 六 共用体/联合体 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 实验室设备网 版权所有 |