目录
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 ScoreZhou ping 5 18 C 145.0Zhang ping 4 19 A 130.5Liu fang 1 18 A 148.5Cheng ling 2 17 F 139.0Wang 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