目录
需求:结构体包括姓名和票数,用户可以输入每个选民的名字来定义结构体,再逐次输入名字进行投票(唱票环节),最后输出当选者及其票数,还有弃票的数量(这里代码就不写了,业务逻辑蛮清晰的)
2.应用:老师有姓名职业科目,学生有姓名职业班级,用结构体+共用体表达
一 基本概念
有点像java里的类的概念,可以用点运算符进行赋值,或者定义时大括号直接赋值
定义结构体时要和定义全局变量时一样加上“;”不同于函数
另外这里拓展了用字符串数组存汉字的方法:
#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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<2;i++){
puts("请输入姓名:");
scanf("%s",p[i].name);
getchar();
puts("请输入职业 t:老师 S:学生");
scanf("%c",&p[i].career);
if(p[i].career == 't'){
puts("请输入老师的科目:");
scanf("%s",p[i].mes.subject);
}else if(p[i].career == 's'){
puts("请输入学生的班级:");
scanf("%d",&p[i].mes.class);
}else{
puts("输入错误,请重新输入");
i--;
}
}
for(i = 0;i<2;i++){
if(p[i].career == 't'){
printf("姓名:%s\t职业:Teacher\t科目:%s\n",
p[i].name,p[i].mes.subject);
}else{
printf("姓名:%s\t职业:Student\t班级:%d\n",
p[i].name,p[i].mes.class);
}
}
return 0;
}
七 枚举类
不多解释,看代码
#include <stdio.h>
enum Day{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday = 3,
Friday,
Saturday
};
enum{
January,February,March,April,May,June,
July,August,September,October,November,December
}m1,m2;
int main(){
enum Day d1 = Sunday;
enum Day d2 = Wednesday;
enum Day d3 = Thursday;
enum Day d4 = Friday;
printf("d1 = %d\n",d1);//d1 = 0
printf("d2 = %d\n",d2);//d2 = 3
printf("d3 = %d\n",d3);//d3 = 3
printf("d4 = %d\n",d4);//d4 = 4
m1 = July;
m2 = February;
printf("m1 = %d\n",m1);//m1 = 7
printf("m2 = %d\n",m2);//m2 = 2
return 0;
}
八 typedef关键字
前两种一般用于单片机,第三种属于作死用法:
#include <stdio.h>
typedef int u8;
typedef unsigned int u16;
typedef int arr[10];
int main(){
u8 a = 100;
u16 b = 11;
arr c = {10};
printf("%d",c[0]);
return 0;
}
一般用在这里比较方便:
#include <stdio.h>
struct Test{
int Id;
int Data;
};
//或者
typedef struct{
int Id;
int Data;
}Demo;//不是Demo变量的意思
typedef struct Test T;
int main(){
T test = {2,666};
T *p = &test;
Demo d1 = {1,333};
return 0;
}