C语言小结--结构体
1 什么是结构体
结构体是一种聚合数据类型,它是一种数据元素的聚合。比如我们描述一个学生时,要求有他的姓名、学校、分数等等信息,在之前的处理中,我们通常会使用单独的数据类型来描述。比如,定义一个字符串数组来描述姓名char name[20] = "xiaoming"
,定义一个浮点数来描述成绩float f = 96.5
等等。但是这种做法有个缺点。所有的这些数据都是为了描述一个学生来定义的,但是它们又没有什么关联。有同学说,我们可以使用数组来定义一个学生,但是数组也有缺陷,一次只能定义一种数据类型。放在这里显然也不合适。所有,一种新的数据类型将被介绍:结构体。
所谓结构体就是将一些已知的数据类型放在一起来定义的一种数据类型。结构体并没有创造出新的数据类型,这点要搞清楚。C语言的结构体和其他高级语言的类有点相似的概念,可以完成对一种事物的抽象。但是C语言的结构体又不具备高级语言的继承和多态的功能。
1.1 结构体声明和定义
和其他类型变量的声明一样,结构体也有自己的关键字:struct
就像我们定义一个整形变量a一样int a
,定义一个结构体变量b同样简单:
struct
{
char name[20];
float score;
}XiaoMing;
这样,我们就定义了一个结构体变量XiaoMing。这个变量包含两个成员,一个是char型的名字,一个是float型的分数,关于结构体的使用我们放在后面介绍。
但是这样定义一个结构体也有些问题,比如我们的程序中有大量的结构体需要使用,每个结构体我们都这样定义,数量一多,就完全的乱掉了,根本无法维护和扩展。所以,有了下面这种声明和定义来解决这个问题。
struct _Student
{
char name[20];
float score;
};
struct _Student XiaoMing;
在声明中给这个结构体加上一个“_Student”的标签后,我们在需要定义的结构体变量的地方可以这样来定义:struct _Student XiaoMing;
。 这样我们就一目了然,原来这个结构体定义的是关于一个学生。
更常见的使用方法是在声明中用typedef 来给结构体起一个别名,这样在定义一个结构体变量时,能使定义看上去更简单明了。
typedef struct _Student
{
char name[20];
float score;
} Student;
Student XiaoMing;
通过上面方式的声明,我们在使用该结构体定义变量时将会变得非常简单:Student XiaoMing; Student XiaoHua;
怎么样,是不是和定义一个整型变量aint a;
一样简单。但是注意我们并没有创建一个新的类型Student,而是使用typedef来重命名了一下而已。这点非常重要。
1.2 结构体的使用
通过上一节的讨论,我们已经可以声明和定义一个结构体了,但是结构体怎么使用呢?这里要引入一个新的操作符“.”,通常我们也叫做点操作符。这个操作符是专门用来访问结构体成员的。比如,我们定义的struct _Stuent XiaoMing;
要使用其中的变量可以这样来使用:XiaoMing.score = 98.5; strncpy("XiaoMing", XiaoMing.name, 8);
在结构体指针中,我们使用‘->’来操作结构体指针所指向的变量。还是用上述的例子来说明:我们定义的struct _Stuent * XiaoMing;
对其所指的变量可以这样来使用:XiaoMing->score = 98.5; strncpy("XiaoMing", XiaoMing->name, 8)
。
结构体在C语言编程中占用很重要的篇幅,尤其是结构体和指针结合起来的编程。同时,结构体也是实现C语言面向对象的编程思想的基础,在我们日常开发中,经常将一个对应的需求抽象为一个结构体,然后进行处理。比如:我们需要对一个学生的综合素质进行评定,可以这样来实现:
typedef (float)(* average_socres)(float * socres_array, unsigned int nums);
typedef struct _Student
{
float math_scores; //数学成绩
float english_scores; //语文成绩
float physical_scores; //物理成绩
average_socres av_socres; //平均成绩指针函数
}Student;
这里只是举一个浅显的例子,可能不是很恰当。欢迎指正…..
具体的实现,后续博客再详细介绍。。。
上一篇: 再学python3(八) :python的常用模块
下一篇: 判断文件是否被恶意篡改