数据结构论坛

首页 » 分类 » 问答 » C编程复合数据类型结构体
TUhjnbcbe - 2024/9/8 8:57:00

实际应用中,我们往往希望把很多不同的信息组合起来,“打包”存储在一个单元中。比如一个学生的信息,可能包含了姓名、年龄、班级、成绩…这些信息的数据类型可能是不同的,所以数组和vector都无法完成这样的功能。

C/C++中提供了另一种更加灵活的数据结构——结构体。结构体是用户自定义的复合数据结构,里面可以包含多个不同类型的数据对象。

结构体的声明

声明一个结构体需要使用struct关键字,具体形式如下:

struct结构体名

{

类型1数据对象1;

类型2数据对象2;

类型3数据对象3;

};

图片来源于网络,侵删

结构体中数据对象的类型和个数都可以自定义,这为数据表达提供了极大的灵活性。结构体可以说是迈向面向对象世界中“类”概念的第一步。

我们可以尝试定义这样一个“学生信息”结构体:

structstudentInfo

{

stringname;

intage;

doublescore;

};

这个结构体中包含了三个数据对象:string类型的名字name,int类型的年龄age,以及double类型的成绩score。一般会把结构体定义在主函数外面,称为“外部定义”,这样可以方便外部访问。

结构体初始化

定义好结构之后,就产生了一个新的类型,叫做“studentInfo”。接下来就可以创建这种类型的对象,并做初始化了。

//创建对象并初始化

studentInfostu={"张三",20,60.0};

结构体对象的初始化非常简单,跟数组完全一样:只要按照对应顺序一次赋值,逗号分隔,最后用花括号括起来就可以了。

结构体还支持其它一些初始化方式:

structstudentInfo

{

stringname;

intage;

doublescore;

}stu1,stu2={"小明",18,75.0};//定义结构体之后立即创建对象

//使用列表初始化

studentInfostu3{"李四",22,87};

//使用另一结构体对象进行赋值

studentInfostu4=stu2;

需要注意:

l创建结构体变量对象时,可以直接用定义好的结构体名作为类型;相比C语言中的定义,这里省略了关键字struct

l不同的初始化方式效果相同,在不同位置定义的对象作用域不同;

l如果没有赋初始值,那么所有数据将被初始化为默认值;算术类型的默认值就是0;

l一般在代码中,会将结构体的定义和对象的创建分开,便于理解和管理

访问结构体中数据

访问结构体变量中的数据成员,可以使用成员运算符(点号.),后面跟上数据成员的名称。例如stu.name就可以访问stu对象的name成员。

cout"学生姓名:"stu.name"\t年龄:"stu.age"\t成绩:"stu.scoreendl;

这种访问内部成员的方式非常经典,后面要讲到的类的操作中,也会用这种方式访问自己的成员函数。

结构体数组

可以把结构体和数组结合起来,创建结构体的数组。顾名思义,结构体数组就是元素为结构体的数组,它的定义和访问跟普通的数组完全一样。

//结构体数组

studentInfos[2]={

{"小红",18,92},

{"小白",20,82}

};

cout"学生姓名:"s[0].name"\t年龄:"s[0].age"\t成绩:"s[0].scoreendl;

cout"学生姓名:"s[1].name"\t年龄:"s[1].age"\t成绩:"s[1].scoreendl;

1
查看完整版本: C编程复合数据类型结构体