做网站公司有哪些,网站建设消费调查问卷,移动端开发工程师,wordpress ajax 注册C语言中的结构体#xff08;struct#xff09;是一种用户自定义的数据类型#xff0c;它允许你将不同类型的数据项组合成一个单一的类型。结构体数组则是一种特殊的数组#xff0c;其元素为结构体类型。这意味着你可以在一个数组中存储多个具有相同结构的记录。 
定义结构体…C语言中的结构体struct是一种用户自定义的数据类型它允许你将不同类型的数据项组合成一个单一的类型。结构体数组则是一种特殊的数组其元素为结构体类型。这意味着你可以在一个数组中存储多个具有相同结构的记录。 
定义结构体数组 
首先你需要定义一个结构体类型然后才能声明该类型的数组。 
定义结构体 
typedef struct Student {char *num;int age;double score;char *addr;
}Student;声明结构体数组 
struct Student arr[3] 
这里arr是一个结构体数组可以存储3个Student类型的记录。 
初始化结构体数组 
可以直接在声明时初始化结构体数组的元素。 struct Student arr[3]  {{001,22,99.9,云南},{002,23,96.35,上海},{003,21,89.956,广州}}; 
访问结构体数组元素 
你可以通过数组索引来访问结构体数组中的元素并通过点操作符.来访问结构体成员。 
len  sizeof(arr)/sizeof(arr[0]);for(i0;ilen;i){printf(学号%s 年龄%d 成绩%.3lf 地址 %s\n,arr[i].num,arr[i].age,arr[i].score,arr[i].addr);} 
输出为 
学号001 年龄22 成绩99.900 地址云南
学号002 年龄23 成绩96.350 地址上海
学号003 年龄21 成绩89.956 地址广州 
结构体数组的使用场景 
结构体数组非常有用特别是在需要处理具有多个属性的数据集合时。例如你可以使用结构体数组来存储班级中所有学生的信息然后遍历这个数组来执行各种操作如计算平均分、查找成绩最高的学生等。 
结构体练习选票系统 
#includestdio.h
#includestring.hstruct XuanMin{char name[32];int  tickets;
};int main()
{struct XuanMin candidate[3];struct XuanMin max  {0,0};int len;int i;int j;char tempname[32];int abandon;int abandtick  0;len  sizeof(candidate)/sizeof(candidate[0]);for(i0;ilen;i){candidate[i].tickets  0;printf(请输入候选人的名字\n,candidate[i]);scanf(%s,candidate[i].name);}for(j0;j5;j){abandon  0;printf(请输入所要投的候选人的名字\n);scanf(%s,tempname);for(i0;i3;i){if(strcmp(tempname,candidate[i].name)  0){candidate[i].tickets;abandon  1;}}if(abandon  0){printf(无所选候选人弃票\n);abandtick;}}for(i0;i3;i){printf(候选人%s,票数%d\n,candidate[i].name,candidate[i].tickets);}for(i0;i3;i){if(max.tickets  candidate[i].tickets){max  candidate[i];}}printf(%s当选票数%d弃票%d,max.name,max.tickets,abandtick);return 0;
} 
输出为 
请输入候选人的名字
aa
请输入候选人的名字
bb
请输入候选人的名字
cc
请输入所要投的候选人的名字
aa
请输入所要投的候选人的名字
aa
请输入所要投的候选人的名字
bb
请输入所要投的候选人的名字
cc
请输入所要投的候选人的名字
a
无所选候选人弃票
候选人aa,票数2
候选人bb,票数1
候选人cc,票数1
aa当选票数2弃票1 
结构体指针 
结构体指针是指向结构体变量的指针它存储的是结构体变量的内存地址而不是结构体变量的值本身。使用结构体指针可以方便地访问和操作结构体中的成员特别是在处理大型数据结构或链表等数据结构时。 
定义结构体和结构体指针 
首先你需要定义一个结构体类型然后才能创建结构体变量和结构体指针。 
//定义一个结构体
struct Test{         char cdata;int  idata;
};//定义结构体指针
struct Test t1  {A,0};
struct Test *pt  t1; 
使用结构体指针访问结构体成员 
通过结构体指针访问结构体成员需要使用解引用操作符-。 
pt-cdata  C;
pt-idata  1;
printf(t1的cdata%c,idata%d\n,t1.cdata,t1.idata);
printf(t1的cdata%c,idata%d\n,pt-cdata,pt-idata); 
输出为 
t1的cdataC,idata1
t1的cdataC,idata1 
使用场景结构体数组进行打印 
struct Student arr[3]  {{001,22,99.9,云南},{002,23,96.35,上海},{003,21,89.956,广州}
};
struct Student *p;
p  arr;len  sizeof(arr)/sizeof(arr[0]);
for(i0;ilen;i){printf(学号%s 年龄%d 成绩%.3lf 地址%s\n,p-num,p-age,p-score,p-addr);p;
} 
练习使用结构体指针实现选票系统 
使用结构体指针要注意 
1.解引用符要使用“-” 
2.每次遍历完循环内要使用p; 
循环外要记得让p重新指向数组头 
#includestdio.h
#includestring.hstruct XuanMin{char name[32];int  tickets;
};int main()
{struct XuanMin candidate[3];struct XuanMin max  {0,0};int len;int i;int j;char tempname[32];int abandon;int abandtick  0;struct XuanMin *p  candidate;len  sizeof(candidate)/sizeof(candidate[0]);for(i0;ilen;i){p-tickets  0;printf(请输入候选人的名字\n);scanf(%s,p-name);p;}for(j0;j5;j){p  candidate;abandon  0;printf(请输入所要投的候选人的名字\n);scanf(%s,tempname);for(i0;i3;i){if(strcmp(tempname,p-name)  0){p-tickets;abandon  1;}p;}if(abandon  0){printf(无所选候选人弃票\n);abandtick;}}p  candidate;for(i0;i3;i){printf(候选人%s,票数%d\n,p-name,p-tickets);p;}p  candidate;for(i0;i3;i){if(max.tickets  p-tickets){max  *p;p;}}printf(%s当选票数%d弃票%d,max.name,max.tickets,abandtick);return 0;
} 
输出为 
请输入候选人的名字
aa
请输入候选人的名字
bb
请输入候选人的名字
cc
请输入所要投的候选人的名字
aa
请输入所要投的候选人的名字
aa
请输入所要投的候选人的名字
bb
请输入所要投的候选人的名字
cc
请输入所要投的候选人的名字
a
无所选候选人弃票
候选人aa,票数2
候选人bb,票数1
候选人cc,票数1
aa当选票数2弃票1 
结构体在函数中的应用 
一个返回值为结构体变量的函数一般使用结构体指针进行定义 
struct XuanMin{char name[32];int  tickets;
};struct XuanMin* initcandidate(struct XuanMin *p)
{return p;
}使用函数对选票系统进行封装如下 
#includestdio.h
#includestring.h
#includestdlib.hstruct XuanMin{char name[32];int  tickets;
};struct XuanMin* initcandidate(struct XuanMin *p,int *total) //候选人初始化
{int i;if(p  NULL){printf(请输入候选总人数\n);scanf(%d,total);p  (struct XuanMin*)malloc(*total*sizeof(struct XuanMin));}for(i0;i*total;i){p-tickets  0;printf(请输入第%d个候选人的名字\n,i1);scanf(%s,p-name);p;}return p-*total;
}void printicket(struct XuanMin *p,int len)  //打印候选人信息
{int i;for(i0;ilen;i){printf(候选人%s,票数%d\n,p-name,p-tickets);p;}
}int doVot(struct XuanMin *p,int len)  //选民进行投票
{int i;int j;int mark;int abandtick  0;char tempname[32];struct XuanMin *pbak  p;for(j0;j5;j){p  pbak;mark  0;printf(请输入所要投的候选人的名字\n);scanf(%s,tempname);for(i0;i3;i){if(strcmp(tempname,p-name)  0){p-tickets;mark  1;}p;}if(mark  0){printf(无所选候选人弃票\n);abandtick;}}return abandtick;
}struct XuanMin* getMax(struct XuanMin *p,int len)  //找出票数最高的候选人
{struct XuanMin *max;int i;max  p;for(i0;ilen;i){if(max-tickets  p-tickets){max  p;}p;}return max;
}int main()
{struct XuanMin *candidate  NULL;int *len;struct XuanMin *final;int abandon;candidate  initcandidate(candidate,len);printicket(candidate,*len);abandon  doVot(candidate,*len);printicket(candidate,*len);final  getMax(candidate,*len);printf(%s当选票数%d弃票%d,final-name,final-tickets,abandon);return 0;
} 
注意 
使用结构体变量作为返回值的函数一般使用的都是结构体指针即返回的值是结构体指针。 
结构体二级指针 
在上边的选票系统中使用initcandidate函数对候选人变量candidate进行初始化包括候选人的姓名和票数在initcandidate函数中我们将结构体指针变量candidate传递进去进行初始化并返回给主函数中。 
我们可以使用二级指针将结构体指针变量candidate的地址传递过去进行操作就可以将initcandidate初始化函数变为无返回值的函数。同理就像我们把表示候选人数量的变量len的地址传递过去这样在初始化函数中获得候选人数量len的值以后不需要使用返回值就能在主函数中获取len的值。 
使用结构体二级指针代码如下 
void initcandidate(struct XuanMin **p,int *total)
{int i;if(*p  NULL){printf(请输入候选总人数\n);scanf(%d,total);*p  (struct XuanMin*)malloc(*total * sizeof(struct XuanMin));}for(i0;i*total;i){(*p)-tickets  0;printf(请输入第%d个候选人的名字\n,i1);scanf(%s,(*p)-name);(*p);}*p  *p - *total;
} 
注意使用二级指针访问结构体变量时依旧使用“-”解引用操作符而且要注意优先级使用“(*p)-tickets”、“(*p)”这种格式来访问。