(五十一)结构

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

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

 

 

时间: 2024-11-08 19:57:45

(五十一)结构的相关文章

浅谈容易被百度降权的五种结构方式

俗话说的好,外链为皇,内容为王,在现在的百度严重,外链和内容是很容易让百度判断你作弊的地方,出了这2点,还有一种就是结构降权的方式,而结构降权就是自己对网站程序不是把握很好,这方面如果发生降权就是对网站产生很大的影响,因为你需要改版调整,等等,自己就简单的说下容易被百度降权的几种结构形式吧. 一:URL的标准化问题-优化代码 曾经见过一份网站,百度收录了下面四个主页,***.com,***.com/index.html,www.***.com,www.***.com/index.html,收录了

GOLIVE5.0教程(五十一)

教程 步骤三.进入GoLive 5中后,参见图4-44创建一个Text Frame,然后按下键盘上的Ctrl + V组合键,粘贴Windows剪切板中的字符. 图4-44 粘贴Windows剪切板中的字符 图4-45输入一些竖直线 步骤四.按下键盘上的Enter键,给出一个回车后,参照上一步操作从"新年快乐.doc"文档中复制一个竖直线字符并粘贴在当前光标所在处.反复操作,直到输入足够的竖直线,参见图4-45. 注:您也可以直接从键盘上输入一条竖直线. 图4-46 选定各字符  

Ruby on rails开发从头来(五十一)- ActiveRecord基础(并发处理)

在学习Rails中的并发处理的处理前,我们先简单了解下并发处理的概念. 在有多个处理同时访问同一个数据库的应用程序中,可能会出现这样的情况,因为一个处理更新了数据库中的行,而使得另一个处理中持有的数据变得陈旧了.例如,A和B先后从数据库中提取了相同的数据,并都做了修改,这时B先将自己的修改更新会数据库,稍后,A将自己的修改更新回数据库,这时将会覆盖B所作的修改,当B再次提取数据库后,看到的是A修改的结果,而不是自己的. 一个解决办法就是将更新的表或者行进行锁定,防止其他程序进行更新或者访问,锁定

猪八戒网答草根五十五问

中介交易 SEO诊断淘宝客 站长团购 云主机 技术大厅 大家好,我是猪八戒网的朱明跃,一个一不小心从传统媒体进入互联网的新手,今后还要多向各位请教. 下面说说我的经历:我的经历比较草根,19岁开始教了三年书,做了9个月的乡干部,8年记者,去年国庆节辞去重庆晚报首席记者,专职运营猪八戒网 . 猪八戒网其实很简单,就是一个服务类的电子商务网站,和淘宝不同的是,在我们网站上交易的不是实物,而是服务.而交易的方式,就是悬赏竞标式.猪八戒网早在2005年就有了,当时只是我的一个个人博客站,我用OBLOG程

dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗

问题描述 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以通过这个指针读取它的成员变量吗 dll里面初始化结构体,返回应用程序指向结构体的指针,应用程序可以直接通过这个指针读取它的成员变量吗? 解决方案 当然是可以的.但是更好的方式是把分配内存的工作交给调用者去做.因为这样不容易忘记释放内存.申请和释放的代码成对出现. 参考windows api里的GetWindowRect,它由调用者传入一个lpRect结构体指针,函数获取了窗口坐标,填充它. 解决方案二: 只要是在同一个

结构和类的区别

问题描述 结构是值类型,类是引用类型结构不能从另外一个结构或者类继承,本身也不能被继承,类完全可扩展的,除非显示的声明sealed否则类可以继承其他类和接口,自身也能被继承.结构里没有方法,只有属性成员,二者均可实现接口 解决方案 解决方案二:结构没有默认的构造函数,但是可以添加构造函数没有析构函数没有abstract和sealed(因为不能继承)不能有protected修饰符可以不使用new初始化在结构中初始化实例字段是错误的类有默认的构造函数有析构函数可以使用abstract和sealed有

中国一“草根”花费五百万狂炒自身博客为出名

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 近来,中国"草根"人群中的一些人热衷通过各种方式让自己出名 中新社发 刘君凤 摄 张爱玲说,出名要趁早.而对于袁智勇来说,遗憾的是没有更早地把五百万"砸"向博客,早点出名. 近来,中国"草根"人群中的一些人热衷通过各种方式让自己出名,"出名狂躁症"也开始 悄然蔓延

商务简报实战技巧

商务演示文稿实战应从两大方面:一是制作篇;二是现场演示篇,下面这篇短文就是从这两方面总结了66招,应该还有很多方面值得重视,我先整理放上.大家一齐补充,欢迎更多实战经验丰富人士加入本贴~~~~ __________________________________________________________ 第一招 • 弄清楚简报的对象是谁 – 如背景如何.人数多少.男女比例.学历的分布等信息都会影响到简报的内容和方式 第二招 • 说听众听得懂的话 – 面对不同的人,应该有不同的沟通方式,用词

Unity全面的面试题(包含答案)

这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么错误,(包括错别字和知识点),或者发现哪里描述的不清晰,请在下面留言,我会重新更新,希望大家共同来帮助开发者 一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3d中的碰撞器和触发器的区别? 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个