结构体(2)

把一个学生的信息(包括学号,姓名,性别,住址)放在一个结构体变量里面,然后输出这个学生的信息。

下面写一个函数来输出学生信息

但上面的函数设计的非常不好,基本不用。因为上面的结构体的字节数就144个了,这都算少的了,要是学校的学生信息管理系统,那他的信息登记角度更多,四五百字节都有,所以说结构体都是很大的。那么我在把实参传递给形参的时候传的数据就很大,传递很大数据很麻烦,那么就需要更好的传递方式。

而指针只有4个字节(要么8个字节),所以要是用指针就只需要传4个字节的数据过来,不管他结构体有多大。所以在C语言里面,结构体作为参数传递一定传的是指针C++里面,一般传的都是类的引用,引用就是一个好用的指针,不会传类的本身最主要的是节约空间。

下面就是用指针传结构体,用的非常多

定义函数来对学生信息输入,输出

也可以这样

即如下图,当然,name前的&也可以加上,但在数组前面加&和不加&虽然都可以,但其两个指针的含义不同,很麻烦,一个是char*,一个是指向数组的指针

3.通过结构体来定义数组,以及结构体数组的使用和传参

结构体数组仍是一个数组,在数组中通过数组名加下标通过遍历找到具体的格子位置,发现这个格子是一个结构体变量,所以访问成员就是arr[2].age

下面写一个输出函数来输出数组arr的所有内容

有3个候选人,每个选民只能投票选一人,要求编一个统计选票的程序,先后输入被选人的名字,最后输出各人得票的结果。

typedef struct Person
{
	char name[20];//候选人名
	int count;//计数器,票数
}; Person;

void Ticket(Person* arr, int len)//统计票数的函数。len为候选人的数量,选民也不需要知道名字,匿名投
{
	char name[20];//保存从键盘读取的名字
	for (int i = 0; i < 5; i++)//选民数量i
	{
		scanf("%s", name);//和候选人的名字比较
		//遍历候选人的名字
		for (int j = 0; j < len; j++)
		{
			if(strcmp(name,arr[j].name)==0)//名字字符串用函数比较
			{
				arr[j].count++;
				break;//只跳出当前一层循环,j的for循环,从下一个i开始
			}
			
		}
	}
}
//输出候选人对应的票数
void Show(const Person* p, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("姓名:%s,票数:%d\n", p[i].name, p[i].count);
	}
}
int main()
{
	Person arr[3] = {"刘备",0,"曹操",0,"孙权",0};//共3个候选人,数组长度为3,数组初始化
	Ticket(arr,sizeof(arr)/sizeof(arr[0]));//len的长度都用sizeof求
	Show(arr, sizeof(arr) / sizeof(arr[0]));
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值