本文是学习过程中的思考与总结,存在许多不妥之处,若有幸被大牛指点出纰漏,必当及时更正,感激不尽!

一、什么是结构体?

二、结构体数组与结构体指针

三、结构体指针作为函数参数

四、typedef的用法

一、什么是结构体?

可以把结构体当作自定义的数据类型,它相当于一个容器,里面容纳了许多的基本数据类型(int ,float ,char ,double…诸如此类)。姑且把结构体所容纳的变量叫做成员变量。

1
2
3
4
5
6
7
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
};

注意:结构体大括号后面的;不能丢,否则不是完整的语句。

既然结构体是一种数据类型,那么就可以用它来定义变量。

1
2
3
4
5
6
7
8
9
10
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;//这是一种定义变量的方法,直接在大括号尾部定义

//还可以如下定义
struct stu stu3,stu4;//定义的时候,struct stu作为整体出现

上述代码中,stu1与stu2便是由stu数据类型定义的变量(类比于int类型定义stu1与stu2)。

需要注意的是:结构体是创建变量的模板(没东西的容器),不占用内存;结构体变量才包含了真实的数据,需要内存来存储。

二、结构体数组与结构体指针

类比着讲更容易理解。
拿int类型举例,int可以定义整型数组,类比来看,结构体数据类型,同样可以定义数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
};
//先定义一个结构体数据类型
int main()
{
int i[5];//定义整型数组
struct stu j[5];//定义stu类型数组
return 0;
}

从代码中可以发现,stu类型数组j包含了五组stu内部的成员变量(name,num,age,group,score)。

结构体数组的使用很简单j[0].score;表示的意思就是stu类型的j数组中第一组score。

当一个指针变量指向结构体时,我们就称它为结构体指针。

注意:结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;

int main()
{
struct stu *pstu=&stu1;//只能这样赋值
struct stu *pstu=stu1;//这样赋值是错的
return 0;
}

通过结构体指针可获得结构体中的成员,(*pstu).score或者pstu->score

三、结构体变量作为函数参数

结构体变量名代表的是整个容器,里面所有成员作为一个集合在一起。而不是同数组一样被编译器转换成指针,用结构体变量传参会极大影响程序的效率。最好的方法就是使用指针,这时由实参传向形参的只是一个地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
} stu1, stu2;
void test(struct stu *pstu);
int main()
{
stu1.score=99.5;
test(&stu1);
return 0;
}
void test(struct stu *pstu1)
{
printf("%d",pstu1->score);
}

输出结果99.5

四、typedef的用法

typedef相当于起外号的工具,在定义结构体变量时非常方便!

1
2
3
4
typedef struct stu{
char name[20];
int age;
} Stu;

如果没有typedef,我们定义结构体变量时,struct stu student1;还要如上操作。
但有了typedef,我们给struct stu起了一个外号Stu。如此一来,在定义结构体类型变量时,只需Stu student1;即可。