本文内容均为本人自己学习的时候做的笔记,如有错误,欢迎指出
什么是结构体
结构体是一种可以由我们自己定义的数据类型
为什么要用结构体
先来看一个例子:假如要我们定义变量来存放学生的信息(学号、年龄、身高、体重、分数等)
如果单独定义变量来存放这些信息,是这样的:
int number,age;
float height,weight,score;
number = 101;
age = 21;
height = 161.2;
weight = 55.5;
score = 92.00;
这些只是一个学生的信息,如果是要存放一整个班的学生信息,可以看出,单用普通类型来定义变量的话就变得非常困难,而结构体则有效的解决了这一问题
例如,用结构体来存放信息,是这样的:
struct student
{
int number;
int age;
float height;
float weight;
float score;
};
struct student stu[40];
将数据项打包在一起,这样所有的学生都有了共同的属性:学号、年龄、身高、体重、分数,存放信息的时候便于管理数据,同时也提高了代码的可读性。
一个结构体可以包含多个“成员”,每个成员的数据类型可以相同,也可以不相同
结构体类型的定义
定义语法:
struct 结构体名
{
成员列表
} ;
上面的代码中,student是结构体名,number,age,height,weight,score都是结构体成员
结构体的类型可以有很多种,名字由关键字struct和结构体名组合而成
结构体变量
我们都知道,普通变量的定义是:类型名 变量名
结构体变量也是如此,这里介绍三种方法来定义结构体变量:
方法一:先声明,后定义
语法:struct 结构体名 变量名 ;
struct 结构体名
{
数据类型 成员变量名 ;
数据类型 成员变量名 ;
数据类型 成员变量名 ;
... ... ;
} ;
举个例子:
struct student
{
int number;
int age;
float height;
float weight;
float score;
};
struct student Tom; //struct student是类型名,Tom是变量名
方法二:在声明结构体类型的同时,定义结构体变量
struct 结构体名
{
数据类型 成员变量名 ;
数据类型 成员变量名 ;
数据类型 成员变量名 ;
... ... ;
}变量名列表 ;
举个例子:
struct student
{
int number;
int age;
float height;
float weight;
float score;
}Tom; //Tom是结构体变量
方法三:省略结构体名,直接定义结构体变量(注意:这种定义方法由于没有结构体名,所以只能定义一次结构体变量)
struct
{
数据类型 成员变量名 ;
数据类型 成员变量名 ;
数据类型 成员变量名 ;
... ...
}变量名列表;
举个例子:
struct
{
int number;
int age;
float height;
float weight;
float score;
}Tom,Jerry; //定义了Tom和Jerry两个结构体变量
这里要注意一点:结构体类型和结构体名是不同的概念,在编译时,对类型是不分配空间的,只对变量分配空间
访问成员的规则
结构体普通变量通过" . "来访问成员,即结构体变量名.成员名,如:Tom.number,Tom.age
结构体指针变量通过"->"来访问成员,如:p->number
结构体变量赋初值
有几种方法可以给结构体变量赋初值,这里只介绍最常用的两种:
方法一:
如:struct Student Tom = {1001, 21, 165.0, 108.0, 99.5 } ; //以上面的结构体为例子
方法二:
Tom . number = 1001;
Tom . age = 21;
Tom . height = 165.0;
Tom . weight = 108.0;
Tom . score = 99.5;
typedef的使用
语法:typedef 已有的类型名 别名;
注意:它不是用来创造类型,而是给已有的类型取一个别名,别名后面的分号" ; "不能省略
例如:typedef int TYPE ; //TYPE与int等价,如TYPE a ; 相当于int a ;
举个例子方便理解:
typedef struct student
{
int number;
int age;
}stu; //stu是struct student类型的别名
stu Tom = {101,21}; //等价于struct student Tom{101,21};
定义别名后,原先的结构体名称也可以继续使用
结构体数组的定义
方法一:先声明,后定义
语法:struct 结构体名 数组名[数组长度] ;
举个例子:
struct student
{
int number;
int age;
};
struct student stu[5]; //stu为结构体数组,数组长度为5
方法二:在声明结构体类型的同时,定义结构体数组
struct 结构体名
{
数据类型 成员变量名 ;
数据类型 成员变量名 ;
数据类型 成员变量名 ;
... ...
}数组名[数组长度] ;
举个例子:
struct student
{
int number;
int age;
}stu[5]; //stu为结构体数组,数组长度为5
结构体数组的初始化
语法:struct 结构体名 数组名[数组长度] = {初值列表} ;
举个例子:
struct student
{
int number;
int age;
};
struct student stu[5] = {{1001,21},{1002,20},{1003,18},{1004,25},{1005,24}};
//将1001和21分别赋给stu[0].number和stu[0].age
//将1002和20分别赋给stu[1].number和stu[1].age
//将1003和18分别赋给stu[2].number和stu[2].age
//将1004和25分别赋给stu[3].number和stu[3].age
//将1005和21分别赋给stu[4].number和stu[4].age
下面有一个结构体的小练习,有兴趣的可以做一下,非常简单
/*
有n个学生的信息(包括学号、成绩)
找出成绩最高的学生
并输出该学生的信息
*/
代码如下:
#include <stdio.h>
typedef struct
{
int num;
float score;
}stu;
int max_score(stu s[],int n);
void Input(stu s[],int n);
int main()
{
stu s[5];
int max;
Input(s,5);
max = max_score(s,5);
printf("成绩最高的学生学号为:%d 分数为:%.1f",s[max].num,s[max].score);
return 0;
}
int max_score(stu s[],int n)
{
int i,max=0;
for(i=0;i<n;i++)
{
if(s[i].score>s[max].score)
max = i;
}
return max;
}
void Input(stu s[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("请输入第%d个同学的学号和分数:",i+1);
scanf("%d %f",&s[i].num,&s[i].score);
}
}