(五十一)结构

简介:

结构是比数组更加灵活和全面的一种数据格式。与数组只能储存相同类型的数据不同,结构可以即储存int类型,同时储存float、double、char类型等。

 

结构是C++的OOP(面向对象编程)的基础。

 

结构的声明格式为:

struct 结构名
{
	类型名1 变量名1;
类型名2 变量名2;
……	……
}

一般使用外部结构声明,即在int main(){}外进行声明。

然而,在创建结构数组的时候,一般在int main()的内部进行,格式为:

结构名(如player) 使用结构的系列元素的代号(如abc)={变量1的值,变量2的值,……}

 

上代码:

#include <iostream>
#include<string>	//因为要使用string类型,故引入头文件
using namespace std;

struct player	//声明一个名称为player的结构
{
	string name;	//结构中第一个声明为string类型的变量,变量名为name。用作储存角色名
	int str;	//结构中第二个声明为int类型的变量,变量名为str。用作储存攻击力
	int hp;		//结构中第三个声明为int类型的变量,变量名为hp。用作储存血量
};

int main()	//进入主函数
{
	cout << "输入你的游戏角色名:";	//要求玩家输入自定义的名字
	string name1;	//定义string类变量name1,用于玩家输入名字时存储
	cin >> name1;	//将玩家输入的名字存储到变量name1中,注意,这个name1不是声明player结构时,里面的string类name
	player first = { name1,10,100 };	//声明在player结构中,创造一个first的数组,分别使用玩家输入的名字变量name1,将str变量初始化为10,hp变量初始化为100
	cout << "你的游戏角色名为:" << first.name << "\n攻击力为:" << first.str << "\n血量为:" << first.hp << endl;	//当引用的时候,是 数组名.结构名中的变量名。
	//例如first是创建数组时的数组名,而first.name中的name,是结构player中的第一个变量名name。意思就是,调用数组first中的某个变量,然后编译器会自动读取该数组中的对应变量。
	cout << "你的游戏角色名称的第一个字符是" << first.name[0] << endl;
	system("pause");
	return 0;
}

输出:


输入你的游戏角色名:wang
你的游戏角色名为:wang
攻击力为:10
血量为:100
你的游戏角色名称的第一个字符是w

注意:

①在结构进行初始化的时候,每个值要符合结构声明的变量类型;

②结构一般使用外部结构声明;

③使用同一种结构的两个结构,可以直接通过“=”等号进行赋值。例如:

代码:


#include <iostream>	
#include<string>

using namespace std;
struct aa	//创建结构
{
	string name;	//名字
	int price;	//价格
	int sl;	//数量
};

int main()
{
	aa	football = { "足球",10,5 };	//创建足球结构,三个变量分别为“足球”,10元/个,5个
	aa lanqiu = football;	//创建篮球结构,并且值等同于足球。
	cout << lanqiu.name << "的价格为" << lanqiu.price << "元/个。存货为:" << lanqiu.sl << "个。" << endl;	//因为篮球的值等于足球,因此显示足球的值可以用篮球替代,证明直接赋值是有效的
	lanqiu.name = "篮球";	//将篮球结构的名字更改为“篮球”
	lanqiu.price = 12;	//更改价格
	lanqiu.sl = 10;	//更改数量
	cout << endl;
	cout << lanqiu.name << "的价格为" << lanqiu.price << "元/个。存货为:" << lanqiu.sl << "个。" << endl;	//和显示足球同样的语句,但因为变更了值,因此显示的为变更后篮球结构的各个值。
	system("pause");
	return 0;
}

④在创建结构的时候同时赋值。方法是:


struct 结构名
{
类型名 变量名;
…… ……;
}使用该结构的某个结构变量名=
{
值1;
……;
};

如代码:


#include <iostream>
#include<string>

struct abc
{
	std::string name;
	std::string price;
}apple = { "苹果","5元一斤" };	//在结构定义后直接声明变量
//非直接声明的形式如下:
//abc apple={ "苹果","5元一斤" };
//相当于节省了一个结构定义名

int main()
{
	using namespace std;
	abc banana = apple;
	cout << "水果名字为:" << apple.name << "。价格为:" << apple.price << endl;
	banana.name = "香蕉";
	banana.price = "3元一斤";
	cout << "水果名字为:" << banana.name << "。价格为:" << banana.price << endl;
	system("pause");
	return	0;
}

但这种办法不清晰,将结构定义和声明结构(初始化结构)的时候分开使用,可以让代码阅读起来更清晰和容易理解。

 

 

结构数组:

上代码:

struct abc
{
	std::string name;
	std::string price;
}

在abc这个结构定义中,有两个数组。我们可以在新创建的结构里,分别为两个数组赋值。

另外,也可以创建一个数组,数组的每个元素都是abc这个结构定义。

例如:


#include <iostream>
#include<string>
using namespace std;
struct abc
{
	string name;
	string price;
};

int main()
{
	abc shuiguo[2]=		//创建数组shuiguo,数组元素数为2(即数组中有两个结构作为元素),第一个元素为shuiguo[0],第二个元素为shuiguo[1]
	{
	{"苹果","5元一斤"},	//给数组中第一个元素——shuiguo[0]结构进行初始化,注意,结尾是逗号。赋值方法等同给普通结构初始化。
	{"香蕉", "3元一斤"}	//给数组中第二个元素——shuiguo[1]结构进行初始化,注意。结尾无符号。
	};
	cout << "第一个水果名称为:" << shuiguo[0].name << "。价格为:"<<shuiguo[0].price << endl;	//显示数组中第一个元素相应的值
	cout << "第二个水果名称为:" << shuiguo[1].name << "。价格为:"<<shuiguo[1].price << endl;	//显示数组中第二个元素相应的值
	//注意用数组的时候,原本是 结构名.变量名,现在为 数组名[N-1].变量名 ,N为第N个元素。数组名 其实就是变相的 结构名,
	//只不过结构名需要自己在初始化的时候进行声明,而 数组名 是共享一个名字,只不过括号里的数字不同,实质上还是一样的。
	system("pause");
	return	0;
}

输出:


第一个水果名称为:苹果。价格为:5元一斤
第二个水果名称为:香蕉。价格为:3元一斤

数组名实质上和结构名是一样的,只不过看起来不一样(因为数组名有中括号)。

用数组的方式进行结构初始化时,每个结构的初始化方法和正常进行初始化相同——即两个大括号之间按定义结构时的变量要求填写变量。

 

 

定义结构时,使用指定的位数:

在定义结构的时候,可以指定每个变量使用特定长度位数,比如4位,8位等。上代码:

struct aa
{
	unsigned int pirce : 4;	//使用4位作为价格(price)的储存位置
	signed int : 8;	//然后8位不被使用
	bool tall : 1;	//使用1位作为tall的是非安短
};

按照教程说明,对于创建与某个硬件设备上的寄存器对应的数据结构 来说,非常方便。

格式为:

类型名 变量名:位数;

变量名后为冒号,位数填写具体需要的位数,之后为分号

 

不过教程说,一般用于低级编程中,一般可以用整型或附录E介绍的按位运算符来代替这种方式。

总之,貌似应用的地方不多,先过,以后需要的时候再补充。

 

 


目录
相关文章
|
存储 定位技术
我爱啃书--逻辑结构与物理结构(大话数据结构)
我爱啃书--逻辑结构与物理结构(大话数据结构)
97 0
|
存储 机器学习/深度学习 算法
数据结构开篇:逻辑结构和物理结构、算法复杂度
数据结构开篇:逻辑结构和物理结构、算法复杂度
|
存储
数据结构上机实践第五周项目2 - 建立链栈算法库
数据结构上机实践第五周项目2 - 建立链栈算法库
265 0
数据结构上机实践第五周项目2 - 建立链栈算法库
|
算法
数据结构上机实践第八周项目2- 建立链串的算法库
数据结构上机实践第八周项目2- 建立链串的算法库
106 0
数据结构上机实践第八周项目2- 建立链串的算法库
|
芯片 SoC
FinFET工作原理、结构和应用特性介绍
FinFET的全称是Fin Field-Effect Transistor。它是一种新型互补金属氧化物半导体晶体管。FinFET 的名称是基于晶体管和鳍片形状的相似性。
12553 0
FinFET工作原理、结构和应用特性介绍
|
5月前
|
C++
【C++基础】程序流程结构详解
这篇文章详细介绍了C++中程序流程的三种基本结构:顺序结构、选择结构和循环结构,包括if语句、三目运算符、switch语句、while循环、do…while循环、for循环以及跳转语句break、continue和goto的使用和示例。
94 2
|
存储
数据结构开篇(数据的概念以及数据的结构与关系)
数据结构开篇(数据的概念以及数据的结构与关系)
139 0
|
监控 数据库 索引
内存数据库内核开发 工作日志(内存索引实现原理)(附红黑树实现清晰完整直接可编译运行代码)(十)
  这里回到文章主目录 [置顶]内存数据库内核开发探索        之前由于考虑到使用Page的内存和磁盘互换的机制实现了B-tree做为数据库的键值索引,在真实的生产环境下2000万以上的数据建立索引会使到B-tree层数增多,效率明显下降,在运算工程中使用AIX大型机都用了数天才将2000多万的数据生成出来,效果非常不理想。
894 0

热门文章

最新文章