结构是比数组更加灵活和全面的一种数据格式。与数组只能储存相同类型的数据不同,结构可以即储存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介绍的按位运算符来代替这种方式。
总之,貌似应用的地方不多,先过,以后需要的时候再补充。