写在前面
在数组、指针、引用介绍完毕后,今天开始一个新的模块的学习,结构体。不论是C还是C++都是有结构体的,在项目中结构体也是经常遇到的。我们看一些大神的程序,上来先给你列一个结构体,哇,瞬间就被征服了,这个人好牛。其实结构体并没有那么复杂,作为人工设计的数据类型,结构体是会更加方便的人们对项目的开发和程序的维护。下面我们就来了解一下结构体。
认识结构体
结构体是一种数据类型,但是这种数据类型是构造出来的,像int、char等这样的数据类型,对于数据的记录是单一类型的数据,而结构体却可以将它们融合起来作为一种新的数据类型。就比如说,我想买车,那我去看车的时候就得需要了解这辆车,比如这辆车的牌子,这辆车的价格,这辆车的性能,如果说给车的牌子、价格、和性能分别分配一个变量,就会显得程序太过散乱,不但给阅读者带来一种混乱感,在代码的后期维护上也是很不方便的。
因此,为了能够使代码更加简洁明了,增加程序代码的美感和可阅读性,让我们来看一下结构体是啥样的。
struct Car
{
int Cpricce;
char Cname[20];
char Cfunction;
};
首先是关键词 struct,然后紧跟着是新类型的名称 Car,在花括号中的内容就是该结构体的成员,成员有自己的类型。这里看来就感觉结构体和数组有些类似,区别在于数组存放的元素是相同的类型,而结构体则是由不同类型的数据构成的集合。
结构体变量的声明
定义好了结构体之后,就会生成一个新的数据类型,通过该结构体定义的变量成为结构体变量。声明结构体变量的方式见下:
第一种:定义结构体之后,使用结构体类型声明;
struct Car
{
int Cprice;
string Cname[20];
char Cfunction;
};
Car car1;
第二种:定义结构体的时候直接声明
struct Car
{
int Cprice;
string Cname[20];
char Cfunction;
}car1;
这两种方式的声明都是可以的,car1就是一个Car类型的数据。使用第二种方法进行声明的时候,可以声明多个变量,car1,car2,car3....都行的。 如:
struct Car
{
int Cprice;
string Cname[20];
char Cfunction;
}car1, car2, car3;
结构体成员初始化及引用
在得到了结构体变量之后,每一个结构体变量包含的数据成员都需要进行初始化。对其初始化就需要先了解引用结构体变量成员的方式,针对于结构体变量类型,有两种引用方式:
一、结构体变量被声明之后,通过运算符 · 来进行引用;
二、结构体变量是指针变量,通过运算符 -> 来进行引用。
#include<iostream>
#include<string>
using namespace std;
void main()
{
struct Car //定义结构体
{
int Cprice;
string Cname;
char Cfunction;
char Cfuel[20];
}car1; //结构体变量
car1.Cprice = 10; //初始化开始
car1.Cname = "宝马";
car1.Cfunction = 'A';
strcpy_s(car1.Cfuel, "汽油");
cout << "汽车的价格:" << car1.Cprice << endl; //输出初始化成员结果
cout << "汽车的牌子:" << car1.Cname << endl;
cout << "汽车的性能:" << car1.Cfunction << endl;
cout << "汽车的用油重量:" << car1.Cfuel << endl;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
struct Car //定义结构体
{
int Cprice;
string Cname;
char Cfunction;
char Cfuel[20];
}car1; //结构体变量
Car *p_car1; //结构体指针变量
p_car1 = &car1;
p_car1->Cprice = 10; //初始化
p_car1->Cname = "宝马";
p_car1->Cfunction = 'A';
strcpy_s(p_car1->Cfuel, "汽油");
cout << "汽车的价格:" << p_car1->Cprice << endl;//输出初始化结果
cout << "汽车的牌子:" << p_car1->Cname << endl;
cout << "汽车的性能:" << p_car1->Cfunction << endl;
cout << "汽车的用油重量:" << p_car1->Cfuel << endl;
}
结构体嵌套
当我们通过定义结构体形成一个新的数据类型A之后,这个新的构造数据类型A可以在另外一个定义的构造数据类型B中声明其变量。当然,还有一种方法是在结构体内部再定义结构体实现结构体的嵌套。
struct Car
{
int Cprice;
string Cname;
char Cfunction;
char Cfuel[20];
struct Cfactory
{
string C_Add; //工厂地址
int C_Post; //邮编
int C_Num; //街道编号
};
};
struct Cfactory
{
string C_Add; //工厂地址
int C_Post; //邮编
int C_Num; //街道编号
};
struct Car
{
int Cprice;
string Cname;
char Cfunction;
char Cfuel[20];
Cfactory mycar;
};
结构体的嵌套其实很简单,可以通过一个例子来学习。
#include<iostream>
#include<string>
using namespace std;
void main()
{
struct Car
{
int Cprice;
string Cname;
char Cfunction;
char Cfuel[20];
struct Cfactory
{
string C_Add; //工厂地址
int C_Post; //邮编
int C_Num; //街道编号
};
Cfactory mycar;
};
Car car1;
car1.mycar.C_Add = "北京"; //内部结构体变量成员初始化
car1.mycar.C_Post = 12345;
car1.mycar.C_Num = 888;
car1.Cprice = 10; //外部结构体变量成员初始化
car1.Cname = "宝马";
car1.Cfunction = 'A';
strcpy_s(car1.Cfuel, "汽油");
cout << "内部结构体的结果" << endl;
cout << "我的汽车生产地址: " << car1.mycar.C_Add << endl;
cout << "我的汽车地址的邮编: " << car1.mycar.C_Post << endl;
cout << "我的汽车地址的街道编号: " << car1.mycar.C_Num << endl;
cout << endl;
cout << "外部结构体的结果" << endl;
cout << "汽车的价格: " << car1.Cprice << endl;//输出初始化结果
cout << "汽车的牌子: " << car1.Cname << endl;
cout << "汽车的性能: " << car1.Cfunction << endl;
cout << "汽车的用油重量: " << car1.Cfuel << endl;
}
运行的结果如图:
结构体大小
结构体作为一种构造数据类型,同样的跟占用内存的大小分不开关系。结构体的大小我们需要注意:
得到的结构体大小结果要为成员中最大字节的整数倍。
一般来说,没有字符对齐要求或者是结构体成员对其单位为1的时候,结构体的大小是其内部各成员大小的和;
但是在结构体成员对齐单位发生改变的时候,结构体的大小也会发生改变。
举个例子:
#include <iostream>
#include<string>
using namespace std;
void main()
{
struct Car //定义结构体
{
int Cprice;
char Cfunction;
char Cfuel[20];
//char Ctest;
}car1; //结构体变量
cout << sizeof(car1) << endl;
}
运行结果是28,
这是为什么呢?
首先我们来看成员类型,int整型占用4个字节,字符数组Cfuel占用20个字节,char字符型占用1个字节,这样累加起来得到的结果不应该是25吗?其实不然,占用字节最多的类型为int,占用4个字节,但是25不可以整除,因此大小肯定不是25,那具体结果为什么是28呢?我们已经知道了在这个结构体中int是占字节数最大的数据类型,因此int之后的数据类型都以4个字节为准,字节数不够的,填补空白位。占用空间的结果应该是这样的:
在加上字符数组占的20个字节,因此一共是28个字节。
但是如果再加上一个char类型的数据的话,得到的大小仍然是28,
这是因为新的char类型的数据填补在第一个char后面的位置。占用空间的结果是这样的:
因此还是占用28个字节。
结构体的介绍到此结束,希望对大家有些帮助!