(五十一)结构

本文深入解析C++中结构的概念与用法,包括声明、初始化、数组及位数指定等方面,详细展示了如何利用结构实现复杂数据的灵活存储与管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

结构是比数组更加灵活和全面的一种数据格式。与数组只能储存相同类型的数据不同,结构可以即储存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介绍的按位运算符来代替这种方式。

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

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值