结构体指针的引入

概念引入

结构体指针类似于前面学习过的指针,我们先回忆下指针:指针就是地址,指针变量就是存放地址的变量。而结构体也是变量,变量访问有两种方式:1.变量名, 2.地址,之前案例,是用变量名访问。通过结构体变量地址来访问该结构体需要一个变量来保持这个地址:这和之前说的指针,其实是一样的,只是指针类型是结构体

定义方式

两者的定义方式基本一直,普通变量通过指针访问地址数据,而结构体变量通过结构体指针访问。

普通指针的定义

int a,
int *p;
p = &a;

结构体指针的定义

struct Test t;
struct Test *p;
p= &t

访问方式

结构体指针访问变量方法有:

1)p->结构体成员;
2)(*p).结构体成员;

#include <stdio.h>

struct Test
{
	int Data1;
	char Data2;
};

int main()
{
	struct Test data = {10,'a'};//1.类型 2.名 3.值
	struct Test *p = &data;//4.地址
	
	printf("通过data结构体访问得到的Data1是%d\n",data.Data1);
	printf("通过指针*p结构体访问得到的Data1是%d\n",p->Data1);
	printf("通过指针*p结构体访问得到的Data1是%d\n",(*p).Data1);
	
	printf("通过data结构体访问得到的Data2是%c\n",data.Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",p->Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",(*p).Data2);
	
	p->Data2 = 'm';//对指向数据进行修改
	printf("通过data结构体访问得到的Data2是%c\n",data.Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",p->Data2);
	printf("通过指针*p结构体访问得到的Data2是%c\n",(*p).Data2);
	
	return 0;
}

实际应用

我们用结构体指针对前面的选票系统加以改良

#include <stdio.h>
#include <string.h>

struct XuanMin
{
	char name[64];
	int tickets;
};

int main()
{
	struct XuanMin a[3];//三位选手
	struct XuanMin max;//比较三位选手得票最大值
	struct XuanMin *p = a;//指向首地址数据
	
	int number = 5;//5个人参与投票
	char tempname[64];//投票的名字
	int feipiao = 0;//没选中的票
	
	int i;
	int j;
	int c = 0;//一个判断逻辑
	
	int len = sizeof(a)/sizeof(a[0]);
	
	p = a;//指向首地址
	for(i = 0;i < len;i++)
	{
		p->tickets = 0;
		printf("请输入第%d个选民的名字:\n",i+1);
		scanf("%s",p->name);
		p++;
	}
	p = a;//指向首地址
	for(i = 0;i < 5;i++)
	{
		c = 0;//每次循环让其等于0
		printf("请输入你要投给谁\n");
		memset(tempname,'\0',sizeof(tempname));//每次清空一下
		scanf("%s",tempname);//输入选中的选民
		p = a;//指向首地址
		for(j = 0;j < len;j++)
		{
			if(strcmp(tempname,p->name)==0)//选民与选手匹配,票数递增
			{
				p->tickets++;
				c = 1;//如果匹配后票数增加并等于1
			}
			p++;
		}
		if(c == 0)//还是为0说明没有匹配选手,则为没选中的票
		{
			printf("没有此选手,投票失败\n");
			feipiao++;
		}
	}
	p = a;//指向首地址
	for(i = 0;i < len;i++)
	{
		printf("名字:%s,票数:%d\n",p->name,p->tickets);
		p++;z
	}
	p = a;//指向首地址
	max=a[0];//让最大值先等于第一个人
	for(i = 1;i < len ;i++)//i=1是因为max已经等于数组中第一个人,只需要与后面两个进行比较
	{
		if(max.tickets < p->tickets)
		{
			max = a[i];//将三个人票数最多的赋给最大值
		}
		p++;
	}
	
	printf("%s以%d票当选!!!废票是%d\n",max.name,max.tickets,feipiao);
	return 0;
}

注意:1.每次进行新的循环要让指针重新指向首地址

           2.其中包含数组,经过一次循环后要偏移到数组中的下一位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值