目录
什么是结构体?
首先我们为什么要用到结构体,我们都已经学了很多int char …等类型还学到了同类型元素构成的数组,以及取上述类型的指针,在一些小应用可以灵活使用,然而,在我们实际应用中,每一种变量进行一次声明,再结合起来显然是不太实际的,类如一位学生的信息管理,他可能有,姓名(char),学号(int)成绩(float)等多种数据。如果把这些数据分别单独定义,就会特别松散、复杂,难以规划,因此我们需要把一些相关的变量组合起来,以一个整体形式对对象进行描述,这就是结构体的好处。
结构体和数组的区别
数组是存储同一类型的数据(都是int,都是char),结构体是存储不同类型的数据,比如定义一个结构体struct student,学生包含名字,学号,分数等不同类型的数据
结构体的使用
先定义结构体类型,再定义结构体变量
struct student //结构体类型 或 结构体名
{
int num;
char name[20]; //结构体成员
int age;
};
int main()
{
struct student stu1,stu2; //结构体变量
return 0;
};
结构体的初始化及访问
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义结构体
struct Student
{
char name[32];
int num;
};
int main()
{
//struct Student stu1 = {"xiaowang", 20}; //结构体赋值方法一
struct Student stu1; //结构体赋值方法二
strcpy(stu1.name,"xioazhou");
stu1.num = 16;
/*
//结构体赋值方法三
struct Student stu1;
stu1 = (struct Student){"xiaowang", 20};
*/
printf("名字:%s,学号:%d \n",stu1.name, stu1.num); //结构体的访问
}
注意:
▶只有结构体变量才分配地址,而结构体的定义是不分配空间的
▶结构体中各成员的定义和之前的变量定义一样,但在定义时也不分配空间
▶结构体变量的声明需要在主函数之上或者主函数中声明,如果在主函数之下则会报错
结构体综合应用:选票系统
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义结构体
struct Xuanmin
{
char name[32];
int tickets;
};
//初始化选民,函数指针,返回一个指针
struct Xuanmin* initXm(struct Xuanmin *p, int *pn)
{
int i = 0;
if(p == NULL)
{
printf("请输入有几个人参选\n");
scanf("%d", pn);
p =(struct Xuanmin *) malloc(*pn * sizeof(struct Xuanmin)); //开辟空间选民个数 * 结构体
}
for(i; i <* pn; i++)
{
printf("请输入第%d个选民的名字:\n",i+1);
scanf("%s",p->name);
p->tickets = 0;
p++; //地址递加偏移
}
return p-*pn; //操作的事是首地址,所以返回首地址,减去偏移量
}
void print(struct Xuanmin *p,int len)
{
int i = 0;
for(i;i<len;i++)
{
printf("名字:%s,票数:%d \n", p->name, p->tickets);
p++;
}
}
int doVot(struct Xuanmin *p,int len)
{
int i;
int j;
char tmpname[32];
int feiPiao = 0;
struct Xuanmin * pbak = p;
for(i=0;i<5;i++) //5个投票人投票
{
int mark = 0;
printf("请输入你投给谁: \n");
memset(tmpname, '\0', sizeof(tmpname));
scanf("%s",tmpname);
p = pbak;
for(j=0;j<len;j++) //拿到名字对应候选人加票
{
//printf("%s,%s \n",tmpname,p->name);
if(strcmp(tmpname, p->name) == 0)
{
p->tickets++;
mark++;
}
p++;
}
if(mark == 0)
{
printf("没有此候选人,放弃\n");
feiPiao++;
}
}
return feiPiao;
}
int main()
{
struct Xuanmin *pxm = NULL;
int total = 0;
pxm = initXm(pxm, &total); //初始选民
printf("选民个数%d \n",total);
print(pxm,total); //打印
int feiPiao = doVot(pxm, total); //选民开始选票
printf("废票数是:%d \n",feiPiao);
print(pxm,total);
return 0;
}