结构体指针和小练习

结构体指针

结构体指针,顾名思义就是指向结构体的指针,和以前那些指向整数的指针一样,结构体指针就是一种指向结构体首地址的指针
一般指针:
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;

}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值