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