C62-结构体的指针
一 初识结构体指针
1. 结构体指针的定义
定义它语法与普通指针类似
// 定义结构体类型
struct Student {char name[20]; // 姓名float score; // 成绩
};// 定义结构体变量
struct Student stu1;// 定义结构体指针(指向stu1)
struct Student *p = &stu1; // p存储stu1的地址
2. 通过结构体指针访问成员
- 箭头运算符
->
:最常用的方式,直接通过指针访问成员(指针->成员
)。 - 解引用 + 点运算符
.
:先解引用指针得到结构体变量,再用点运算符访问((*指针).成员
)。
// 通过指针p给stu1的成员赋值
p->age = 18; // 等价于 (*p).age = 18;
strcpy(p->name, "Tom"); // 等价于 strcpy((*p).name, "Tom");
-
Example:
#include <stdio.h> #include <string.h>struct Student {char name[20];float score; };int main(){//定义结构体变量struct Student stu1; //定义结构体指针struct Student *p=&stu1;//通过指针p给stu1的成员赋值p->score=95.7;strcpy(p->name,"Tom");// 访问成员并打印printf("姓名:%s\n", p->name);printf("年龄:%f\n\n", p->score);//通过指针访问的另一种方式(*p).score= 100.0;strcpy((*p).name, "Jane");printf("姓名:%s\n", (*p).name);printf("年龄:%f\n", (*p).score);return 0; }
-
Show:
二 结构体指针的应用一
结构体指针偏移遍历结构体数组
-
Example:
#include <stdio.h> #include <string.h>//定义Student结构体 struct Student {int id; char name[20]; char gender[4]; // 性别int age; float score; // 成绩char address[20]; // 地址 };int main() {// 初始化结构体数组struct Student stu[3] ={{2, "张三", "男", 17, 99.5, "北京"},{3, "李四", "男", 18, 89.2, "上海"},{4, "王五", "女", 19, 100, "内蒙"}};// 计算数组长度int len = sizeof(stu) / sizeof(stu[0]);// 定义结构体指针并指向数组struct Student *p;p = stu; // 数组名即首元素地址,等价于 p = &arr2[0]//结构体指针偏移遍历结构体数组int i=0;for(i=0;i<len;i++){printf("学号:%d,姓名:%s,性别:%s年龄:%d,成绩:%f,地址:%s\n\n",p->id,p->name,p->gender,p->age,p->score,p->address);p++;}return 0; }
-
Show:
三 结构体指针的应用二
结构体数组指针优化选票系统
-
Example:
//三个候选者,五个选民每人一张票 #include <stdio.h> #include <string.h>struct Candidate {char name[32];int votes; }; int main() {//声明结构体数组struct Candidate candidates[3]; //candidates:候选者们struct Candidate electee; //electee:当选者struct Candidate *ptr_candidates=candidates;//相关数据定义int AbandonedTickets=0; //计数弃票char TempName[32]; //用于临时存放选民的意向人名字//初始化选民信息int i;int j;int mark;int len=sizeof(candidates)/sizeof(candidates[0]);for(i=0;i<len;i++){ptr_candidates->votes=0;printf("请输入第%d个候选者的名字:\n",i+1);scanf("%s", ptr_candidates->name);ptr_candidates++;}//唱票环节for(i=0;i<5;i++){ mark=0; memset(TempName,'\0',sizeof(TempName)); //清空临时存放,避免后期比对错误printf("请问你把票投给谁:\n");scanf("%s",TempName);ptr_candidates=candidates;for (j= 0; j<len;j++){if (strcmp(TempName,ptr_candidates->name)==0){ptr_candidates->votes++;mark=1;// 找到匹配后可提前退出内层循环,优化效率break;}ptr_candidates++;}// 修复:将弃票判断移至内层循环外,确保检查所有候选人后再判断if (mark==0){printf("不存在此候选人,意味着你弃票!\n");AbandonedTickets++;} }//结果公示ptr_candidates=candidates;for(i=0;i<len;i++){printf("名字:%s,票数:%d\n",ptr_candidates->name,ptr_candidates->votes);ptr_candidates++;}printf("\n");electee=candidates[0];ptr_candidates=candidates;for (i=0; i<len;i++){if (electee.votes < ptr_candidates->votes){electee = candidates[i];}ptr_candidates++;}printf("%s以%d票当选,弃票为%d",electee.name,electee.votes,AbandonedTickets);return 0; }
-
Show:
四 结构体指针的应用三
结构体指针数组函数综合应用改写选票系统
-
Example:
//三个候选者,五个选民每人一张票 #include <stdio.h> #include <string.h> #include <stdlib.h>//定义候选者结构体 struct Candidate {char name[32];int votes; }; //定义函数:候选者信息初始化,调用该函数后将返回"结构体指针" struct Candidate *InitCandidates(struct Candidate *ptr_candidates,int*ptr_n) {if(ptr_candidates==NULL){printf( "请输入候选者人数:\n");scanf("%d",ptr_n);ptr_candidates=(struct Candidate *)malloc(*ptr_n*sizeof(struct Candidate)); //给结构体指针动态开辟内存}int i;for (i=0;i<*ptr_n;i++){ptr_candidates->votes=0;printf("请输入第%d个候选者的名字:\n",i+1);scanf("%s", ptr_candidates->name);ptr_candidates++;}return ptr_candidates-*ptr_n; };//定义函数:打印投票结果 void PrintTestForCandidates(struct Candidate *ptr_candidates,int len) {int i;for(i=0;i<len;i++){printf("名字:%s,票数:%d\n",ptr_candidates->name,ptr_candidates->votes);ptr_candidates++;} }//定义函数:计票 void CountVotes(struct Candidate *ptr_candidates,int len,int *AbandonedTickets) {int i ,j;int mark;char TempName[32];struct Candidate *ptr_back_candidates=ptr_candidates;for(i=0;i<5;i++){ mark=0; memset(TempName,'\0',sizeof(TempName)); //清空临时存放,避免后期比对错误printf("请问你把票投给谁:\n");scanf("%s",TempName);ptr_candidates=ptr_back_candidates;for (j= 0; j<len;j++){if (strcmp(TempName,ptr_candidates->name)==0){ptr_candidates->votes++;mark=1;break;}ptr_candidates++;}if (mark==0){printf("不存在此候选人,意味着你弃票!\n");(*AbandonedTickets)++;} } }//定义函数:打印当选者及票数 struct Candidate *GetElectee(struct Candidate *ptr_candidates,int len,int *AbandonedTickets) {int i;struct Candidate *ptr_electee;ptr_electee=ptr_candidates;for (i=0; i<len;i++){if (ptr_electee->votes < ptr_candidates->votes){ptr_electee=ptr_candidates;}ptr_candidates++;}printf("%s以%d票当选,弃票为%d\n",ptr_electee->name,ptr_electee->votes,*AbandonedTickets);return ptr_electee; }int main() {//相关变量定义int totalNum=0;int AbandonedTickets=0;struct Candidate *ptr_candidates=NULL; //定义结构体指针//调用函数:初始化候选人信息,给结构体指针赋值ptr_candidates=InitCandidates(ptr_candidates,&totalNum); //调用函数:计票CountVotes(ptr_candidates,totalNum,&AbandonedTickets);//调用函数:打印当选者信息GetElectee(ptr_candidates,totalNum,&AbandonedTickets);//打印所有候选者得票情况PrintTestForCandidates(ptr_candidates,totalNum);//释放动态分配的内存,防止内存泄漏free(ptr_candidates);return 0; }
-
Show: