让我们来认识一下较复杂的C语言结构体

目录

1.结构体是什么?

2.结构体数组

3.结构体指针


1.什么是结构体?

C 语言 中,可以使用 结构体( Struct 来存放一组不同类型的数据。结构体的定义形式为:
struct 结构体名{
结构体所包含的变量或数组
};
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的 成员(Member)
1. struct stu {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在学习小组
6. float score; //成绩
7. };
stu 为结构体名,它包含了 5 个成员,分别是 name、num、age、group、score。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化.。
注意大括号后面的分号;不能少,这是一条完整的语句。

(1)结构体变量

struct stu stu1, stu2;
定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字 struct 不能少。
你也可以在定义结构体的同时定义结构体变量
1. struct stu {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在学习小组
6. float score; //成绩
7. } stu1, stu2;
将变量放在结构体定义的最后即可。
如果只需要 stu1、stu2 两个变量,后面不需要再使用结构体名定义其他变量,那么在定义时也可以不给出结构体名,如下所示:
1. struct { //没有写 stu
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在学习小组
6. float score; //成绩
7. } stu1, stu2;

(2)成员的获取和赋值

结构体使用点号.获取单个成员。获取结构体成员的一般格式为:
结构体变量名.成员名;
通过这种方式可以获取成员的值,也可以给成员赋值:
1. #include <stdio.h>
2. int main(){
3. struct {
4. char *name; //姓名
5. int num; //学号
6. int age; //年龄
7. char group; //所在小组
8. float score; //成绩
9. } stu1;
10.
11. //给结构体成员赋值
12. stu1.name = "Tom" ;
13. stu1.num = 12;
14. stu1.age = 18;
15. stu1.group = 'A' ;
16. stu1.score = 136.5;
17.
18. //读取结构体成员的值
19. printf( "%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n" , stu1.name, stu1.num, stu1.age,
stu1.group, stu1.score);
20.
21. return 0;
22. }
运行结果:
Tom 的学号是 12,年龄是 18,在 A 组,今年的成绩是 136.5!
除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:
1. struct {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在小组
6. float score; //成绩
7. } stu1, stu2 = { "Tom" , 12, 18, 'A' , 136.5 };
不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。

2.结构体数组

在 C 语言中,定义结构体数组和定义结构体变量的方式类似,请看下面的例子:
1. struct stu {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在小组
6. float score; //成绩
7. }class[5];
表示一个班级有 5 个学生。
结构体数组在定义的同时也可以初始化,例如:
1. struct stu {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在小组
6. float score; //成绩
7. }class[5] = {
8. { "Li ping" , 5, 18, 'C' , 145.0},
9. { "Zhang ping" , 4, 19, 'A' , 130.5},
10. { "He fang" , 1, 18, 'A' , 148.5},
11. { "Cheng ling" , 2, 17, 'F' , 139.0},
12. { "Wang ming" , 3, 17, 'B' , 144.5}
13. };
当对数组中全部元素赋值时,也可不给出数组长度,例如:
1. struct stu {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在小组
6. float score; //成绩
7. }class[] = {
8. { "Li ping" , 5, 18, 'C' , 145.0},
9. { "Zhang ping" , 4, 19, 'A' , 130.5},
10. { "He fang" , 1, 18, 'A' , 148.5},
11. { "Cheng ling" , 2, 17, 'F' , 139.0},
12. { "Wang ming" , 3, 17, 'B' , 144.5}
13. };
【示例】计算全班学生的总成绩、平均成绩和以及 140 分以下的人数。 3.
#include<stdio.h>
struct{
char*name;
int num;
int age;
char group;
float score;
} class[]={
{"Li Ping",5,18,'C',145.0},
{"Zhang ping ",4,19,'A'130.5},
{"He fang" ,1,18,'A'148.5},
{"Cheng ling",2,17,'F',139.0}.
};
int main(){
int i,num_140=0;
float sum=0;
for(i=0;i<4;i++){
sum +=class[i].score;
if(class[i].score<140)num_140++;
}
printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n",sum,sum/5,num_140);
return 0;
}
运行结果:
sum=707.50
average=141.50
num_140=2

3.结构体指针(指向结构体的指针)

当一个 指针 变量指向结构体时,我们就称它为 结构体指针 。C 语言结构体指针的定义形式一般为:
struct 结构体名 *变量名;
下面是一个定义结构体指针的实例:
1. //结构体
2. struct stu {
3. char *name; //姓名
4. int num; //学号
5. int age; //年龄
6. char group; //所在小组
7. float score; //成绩
8. } stu1 = { "Tom" , 12, 18, 'A' , 136.5 };
9. //结构体指针
10. struct stu *pstu = &stu1;
也可以在定义结构体的同时定义结构体指针:
1. struct stu {
2. char *name; //姓名
3. int num; //学号
4. int age; //年龄
5. char group; //所在小组
6. float score; //成绩
7. } stu1 = { "Tom" , 12, 18, 'A' , 136.5 }, *pstu = &stu1;
注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表 示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&,所以给 pstu 赋值只能写作:
struct stu *pstu = &stu1;
而不能写作
struct stu *pstu = stu1;

(1)获取结构体成员

通过结构体指针可以获取结构体成员,一般形式为:

(*pointer).memberName
或者:
pointer->memberName
   注意:->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员。
【示例】结构体指针的使用。
1. #include <stdio.h>
2. int main(){
3. struct {
4. char *name; //姓名
5. int num; //学号
6. int age; //年龄
7. char group; //所在小组
8. float score; //成绩
9. } stu1 = { "Tom" , 12, 18, 'A' , 136.5 }, *pstu = &stu1;
10.
11. //读取结构体成员的值
12. printf( "%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n" , (*pstu).name,                    (*pstu).num,(*pstu).age, (*pstu).group, (*pstu).score);
13. printf( "%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n" , pstu->name, pstu-              >num, pstu->age,pstu->group, pstu->score);
14.
15. return 0;
16. }
运行结果:
Tom 的学号是 12,年龄是 18,在 A 组,今年的成绩是 136.5!
Tom 的学号是 12,年龄是 18,在 A 组,今年的成绩是 136.5!
【示例】结构体数组指针的使用。
1. #include <stdio.h>
2.
3. struct stu {
4. char *name; //姓名
5. int num; //学号
6. int age; //年龄
7. char group; //所在小组
8. float score; //成绩
9. }stus[] = {
10. { "Zhou ping" , 5, 18, 'C' , 145.0},
11. { "Zhang ping" , 4, 19, 'A' , 130.5},
12. { "Liu fang" , 1, 18, 'A' , 148.5},
13. { "Cheng ling" , 2, 17, 'F' , 139.0},
14. { "Wang ming" , 3, 17, 'B' , 144.5}
15. }, *ps;
16.
17. int main(){
18. //求数组长度
19. int len = sizeof (stus) / sizeof ( struct stu );
20. printf( "Name\t\tNum\tAge\tGroup\tScore\t\n" );
21. for (ps=stus; ps<stus+len; ps++){
22. printf( "%s\t%d\t%d\t%c\t%.1f\n" , ps->name, ps->num, ps->age, ps->group, ps->score);
23. }
24.
25. return 0;
26. }
运行结果:
Name           Num     Age    Group     Score
Zhou ping        5         18         C       145.0
Zhang ping      4         19          A       130.5
Liu fang           1         18          A        148.5
Cheng ling       2         17          F        139.0
Wang ming      3         17          B        144.5

(2)结构体指针作函数参数

结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。
【示例】计算全班学生的总成绩、平均成绩和以及 140 分以下的人数。
1. #include <stdio.h>
2.
3. struct stu {
4. char *name; //姓名
5. int num; //学号
6. int age; //年龄
7. char group; //所在小组
8. float score; //成绩
9. }stus[] = {
10. { "Li ping" , 5, 18, 'C' , 145.0},
11. { "Zhang ping" , 4, 19, 'A' , 130.5},
12. { "He fang" , 1, 18, 'A' , 148.5},
13. { "Cheng ling" , 2, 17, 'F' , 139.0},
14. { "Wang ming" , 3, 17, 'B' , 144.5}
15. };
16.
17. void average( struct stu *ps, int len);
18.
19. int main(){
20. int len = sizeof (stus) / sizeof ( struct stu );
21. average(stus, len);
22. return 0;
23. }
24.
25. void average( struct stu * ps , int len ){
26. int i, num_140 = 0;
27. float average, sum = 0;
28. for (i=0; i< len ; i++){
29. sum += ( ps + i) -> score;
30. if (( ps + i)->score < 140) num_140++;
31. }
32. printf( "sum=%.2f\naverage=%.2f\nnum_140=%d\n" , sum, sum/5, num_140);
33. }
运行结果:
sum=707.50
average=141.50
num_140=2
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值