结构体指针
结构体指针,顾名思义就是指向结构体的指针,和以前那些指向整数的指针一样,结构体指针就是一种指向结构体首地址的指针
一般指针:
int a;
int *p;
p = &a;
结构体指针:
struct Test t;
struct Test *p;
p = &t
代码结果
示例代码如下:
#include<stdio.h>
//结构体指针
struct Test
{
int data;
char cdata;
};
int main()
{
int data=10;
int *p=&data;
char cdata='a';
char *p2=&cdata;
struct Test t1={10,'A'};
struct Test *pt1=&t1;//结构体指针
printf("data=%d,cdata=%c\n",*p,*p2);//普通变量指针访问
printf("结构体变量名访问:%d\n",t1.data);//结构体变量名访问,用"."运算符
printf("结构体变量名访问:%c\n",t1.cdata);
pt1->cdata='T';//用结构体指针将cdata中的值换掉
printf("结构体指针访问:%d\n",pt1->data);//结构体指针访问,用"->"运算符
printf("结构体指针访问:%c\n",pt1->cdata);
return 0;
}
运行结果:

用结构体指针输出结构体数组
代码如下:
#include<stdio.h>
//结构体数组(用结构体指针输出)
struct Student
{
int num;
char name[32];
char sex;
int age;
double score;
char address[32];
};
int main()
{
struct Student stu[3]={
{1,“张三”,‘b’,25,78.5,“昆明”},
{2,“李四”,‘b’,21,88.5,“昭通”},
{3,“小昭”,‘g’,18,98.5,“宜良”}
};
struct Student *p;
p=stu;//让结构体指针指向结构体数组的首地址
int i;
int len=sizeof(stu)/sizeof(stu[0]);
for(i=0;i<len;i++)//打印结构体数组中的每个元素
{
printf("学生信息:学号:%d 姓名:%s 性别:%c 年龄:%d 分数:%lf 地址:%s\n",
p->num,p->name,p->sex,p->age,p->score,p->address);
p++;
}
return 0;
}
运行结果:

结构体指针小练习:选票(改成用结构体指针完成)结合注释理解
代码如下:
#include<stdio.h>
#include <string.h>
//选票(改成用结构体指针完成)
//1、把以前用普通变量名、下标访问的.运算符改为结构体指针的->
//2、指针++,每次遍历会到数组的尾巴,下次用的时候记得指回来,即让指针回到数组首地址
struct Voter//选民
{
char name[32];
int tickets;
};
int main()
{
struct Voter vot[3];
struct Voter max;//当选人
struct Voter *p=vot;
int len=sizeof(vot)/sizeof(vot[0]);
int totalVote=5;//总的票数
int i;
int j;
char tempName[32];
int feiPiao=0;//废票的票数
int mark=0;//弃票标志
//初始化选民信息
for(i=0;i<len;i++)
{
p->tickets=0;//将每个选民的选票清空,一定要清空,不然后面的唱票环节会发生不可预料的错误
printf("请输入第%d个选民的名字:\n",i+1);
scanf("%s",p->name);
p++;
}
//唱票环节
for(j=0;j<totalVote;j++)
{
puts("你要将票投给谁:");
memset(tempName,'\0',sizeof(tempName));//每次先将临时选民的名字清空
scanf("%s",tempName);
mark=0;
p=vot;//每次投票会遍历一次结构体数组,p=vot让结构体指针回到结构体数组的第一个位置
for(i=0;i<len;i++)//将投票拿出来看一下
{
if(strcmp(tempName,p->name)==0)//如果拿出来看的票和候选人的名字对的上,就给他的票数+1
{
p->tickets++;
mark=1;//如果mark=1,则此票为有效票
}
p++;
}
if(mark==0)//统计废票的数目
{
printf("不存在此候选人,弃票,此票为废票\n");
feiPiao++;
}
}
//公布结果
p=vot;//p=vot让结构体指针回到结构体数组的第一个位置
for(i=0;i<len;i++)
{
printf("名字:%s 票数:%d\n",p->name,p->tickets);
p++;
}
p=vot;//p=vot让结构体指针回到结构体数组的第一个位置
max=vot[0];//将第一个人设为当选人,与其他人作比较
for(i=0;i<len;i++)
{
if(max.tickets < p->tickets)//如果其他候选人的票数高于此时的当选人,则将其改成当选人
{
max=vot[i];
}
p++;
}
printf("当选人名字:%s 票数:%d 废票为:%d",max.name,max.tickets,feiPiao);
return 0;
}
运行结果:


被折叠的 条评论
为什么被折叠?



