发布时间:2023-04-30 08:00
1.结构体就是不同类型的一组数的集合,切记结构体不像联合体那样所有数据是不共用同一个内存地址的。
结构体的简单定义:
struct Student
{
int scores; //成绩分数
char name[128];//此处定义一个字符数组来保存学生的姓名
int number; //学号
}; //切记这里的分号千万别忘记写
2.函数指针在结构体内的定义与调用
//此处函数指针的原型是
void datas(int a)
{
printf("a = %d!\n",a);
}
struct der
{
void (*p)(int v) = datas;
};
//在main中的调用方式
void (*p)(int v) = datas;
p(12);
struct der f;
f.p = datas;//初始化
f.p(12); //输出
3.结构体指针的定义与使用
(1)如果用结构体指针的话就不能用点(.)运算符来访问结构体内的数据,而是需要用->来访问。
例如:从以前的p.scores变成p->scores
(2)一见到指针就要想到指针有没指向或地址有没有开辟,注意指针是野指针还是指向NULL
例如
struct Student *p //现在的指针P是一个野指针
p = (struct Student *)malloc(sizeof(struct Student));
//上面就是开辟一个结构体大小的,结构体指针类型的空间赋予指针P;
p->scores = 99;
strcpy(p->name,"张三");
//初始化分数scores与名字name;
free(p);//释放指针P的内存空间
p = &stu;
//切记当指针P再指向别的地址时,一定要进行上面的释放指针内存空间的动作
4.接下来举例说明结构体的用法
此时用到的是结构体对象与结构体数组来共同完成投票系统的实现
步骤:1.先进行参选人的信息的初始化
2.再进行对参选人进行投票
3.计算每位参选人的票数,输出领先者
直接上代码:
#include
#include
//结构体实现选票系统
//首先进行选民的初始化
//再进行投票阶段
//输出谁胜出,公布结果
struct Candidata //一个候选人的信息的结构体
{
char name[128];
int tickets;
};
int main()
{
int i;
int j;
int len;
int feipiao = 0;
int mark = 0;
char tempname[128]; //定义一个临时的名字变量用来存放临时输入的候选人的名字
struct Candidata can[3];
struct Candidata max; //定义一个结构体对象以找出票数最多的是谁
len = sizeof(can)/sizeof(can[0]); //计算出候选人的个数是多少
for(i = 0; i < len; i++) //候选人信息的初始化
{
can[i].tickets = 0;
printf("请输入第%d位候选人的名字:\n",i+1);
scanf("%s",can[i].name);
}
//投票阶段,一共有六票
for(j = 0; j < 6; j++)
{
mark = 0;//每进行一次循环,mark都要重新初始化为零
memset(tempname,'\0',sizeof(tempname)); //每输入一次临时的候选人的名字都将其清零一遍
printf("请输入要投票的候选人的名字!\n");
scanf("%s",tempname);
for(i = 0;i < len;i++)
{
if(strcmp(tempname,can[i].name) == 0) //临时输入的候选人在已存在的候选人里查找看看是否有这个人的存在
{
can[i].tickets++; //有的话对应票数加1
mark = 1; //一个标志
}
}
if(mark == 0) //当这个标志为0是说明这个人不存在
{
printf("Sorry,find error!\n");
feipiao++;
}
}
//公布结果阶段
for(j = 0;j < len; j++)
{
printf("候选人:%s,票数:%d\n",can[j].name,can[j].tickets);
}
max = can[0];
for(i = 0;i < len; i++)
{
if(can[i].tickets > max.tickets)
{
max = can[i];
}
}
printf("候选人%s以%d票数胜出!!!,其废票是%d\n",max.name,max.tickets,feipiao);
return 0;
}