结构体学习(1)----结构体基础

写在前面

在数组、指针、引用介绍完毕后,今天开始一个新的模块的学习,结构体。不论是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个字节。

结构体的介绍到此结束,希望对大家有些帮助!

 

 

 

                                 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值