把一个学生的信息(包括学号,姓名,性别,住址)放在一个结构体变量里面,然后输出这个学生的信息。
下面写一个函数来输出学生信息
但上面的函数设计的非常不好,基本不用。因为上面的结构体的字节数就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;
}