结构体
结构体概述
结构体(struct)是具有相同类型或不同类型的数据构成的数据集合。
C++ 中,结构体(struct)指的是一种数据结构,是 C++ 中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。
结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
结构体的定义和初始化
//C++结构体定义 //语法 struct structName { type name1; type name2; type name3; };
用 struct 定义了一个结构体 structName,该结构体有三个字段,字段名分别为 name1、name2 和 name3。定义结构体时,每个字段名后面都需要使用 ; 结尾。最后的大括号后面,同样需要使用 ; 结尾,如果没有分号,则程序会报错。
结构体变量定义
struct 结构体名 结构体变量名;
//方法一 struct student { string name; int age; double score; }; int main(){ student s1,s2,s3; return 0; } //方法二 struct student { string name; int age; double score; }s1,s2,s3;
给成员赋值
//方法一 #include <iostream> using namespace std; struct student { string name; int age; double score; }; int main() { struct student s1; s1.name = "张三";//不同之处 s1.age = 20; s1.score = 99.5; return 0; } //方法二 #include <iostream> using namespace std; struct student { string name; int age; double score; }; int main() { struct student s1; student s1 = { “张三”,20,99.5 };//不同之处 return 0; }
结构体成员访问
#include <iostream> using namespace std; struct student { string name; int age; double score; }; int main() { student s1 = { “张三”,20,99.5 }; cout << s1.name << endl; cout << s1.age << endl; cout << s1.score << endl; return 0; }
结构体默认值
在C++11标准后,可以直接在定义结构体时给成员赋初始值
struct student { string name = "C++"; int age{ 20 }; double score{ 99.5 }; };
结构体中定义函数
//语法 struct structName { type name1; type name2; type name3; type funcName(type val1,type val2) { return val; } }; struct student { string name; int age; double score; void printInfo() { //打印学生信息 cout << name << endl; cout << age << endl; } };
结构体指针
指针可以存放任意的数据类型的地址,比如float、 int、long、dobule,也可以存放结构体的地址,存放结构体地址的指针,称为结构体指针。
//语法 struct structName *pName;
定义了一个结构体指针 pName,该指针存放的是结构体structName 的地址。
访问结构体指针成员
//语法 pName->fileld; //如果是结构体指针,要访问其成员,不再是使用点,而是使用 ->。 //语法 (*pName).fileld; //使用 * 的方式,访问结构体成员,必须要使用 () 改变运算符的优先级,否则,会出错。
访问结构体指针成员案例
student s1; student* ps1 = &s1; ps1->name = "诸葛亮"; (*ps1).age = 20; cout << ps1->name << endl; cout << (*ps1).age << endl;
结构体数组
数组可以存放任意的数据类型,比如 int、dobule,也可以存放结构体,存放结构体的数组,称为结构体数组。
//语法 struct structName arrName[len];
定义了一个结构体数组 arrName,该数组中每一个元素的类型都是一个 structName 类型的结构体,数组的长度为 len。
结构体数组案例
student arrstu[3]; for (int i = 0; i < 3; i++) { //输入 cin >> arrstu[i].name >> arrstu[i].age >> arrstu[i].score; } for (int i = 0; i < 3; i++) { //输出 cout << arrstu[i].name << " " << arrstu[i].age << " " << arrstu[i].score << endl; } student arrstu[3] = { {“name1”,20,90}, {“name2”,21,92}, {“name3”,22,99}, }; for (int i = 0; i < 3; i++) { //输出 cout << arrstu[i].name << " " << arrstu[i].age << " " << arrstu[i].score << endl; }
结构体做函数参数
//语法 type funcName(structName structVal){ return val; }
使用结构体变量作为函数的实参时,采用的是值传递,会将结构体变量所占内存单元的内容全部顺序传递给形参,形参必须是同类型的结构体变量。结构体指针,结构体数组,也可以做参数。
结构体做函数参数案例
#include <iostream> using namespace std;结构 struct student { string name = "C++"; int age{ 20 }; double score{ 99.5 }; }; void printStudent(student s) { cout << s.name << endl; cout << s.age << endl; cout << s.score << endl; } int main() { student s1 = { "王五",21,99 }; printStudent(s1); return 0; } //结构体指针 void printStudent(student* s) { cout << s->name << endl; cout << s->age << endl; cout << s->score << endl; } student s1 = { "王五",21,99 }; printStudent2(&s1); //结构体数组 void printStudent(student s[], int len) { for (int i = 0; i < len; i++) { cout << s[i].name << " " << s[i].age << " " << s[i].score << endl; } } student s1[2] = { "王五",21,99,"张三",19,90 }; printStudent(s1, 2);
共用体
共用体可以存放任意 数据类型 的组合,也可以用来存放任意数据类型的集合;共用体也叫联合体。
结构体的各个成员会占用不同的内存,互相之间没有影响,而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
//语法 union unionName{ Type1 filed1; Type2 filed2; Type3 filed3; }; //该共用体的三个字段是相互影响的,修改其中任何一个字段的值,都会影响其他字段的值 //语法 unionName.fileld;union person { int age; float weight; }; person p1; p1.age = 20; //p1.weight = 50.5; //共用体的成员不可以全部一起使用,只能单独使用其中某一个字段。 cout << p1.age << endl;cout << p1.weight << endl; //共用体成员间影响内存
共用体与结构体区别
共用体和结构体 都可以存放任意 数据类型 的组合,但两者在内存的使用上却有很大的差别。
结构体的各个成员会占用不同的内存,互相之间没有影响,而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
#include<bits/stdc++.h> using namespace std; //结构体 struct StructName { int name1; double name2; string name3; }; //共用体 union UnionName { int filed1; double filed2; string filed3; }; int main() { int sizeStruct = sizeof(struct StructName); int sizeUnion = sizeof(union UnionName); cout << "sizeStruct = " << sizeStruct << " sizeUnion = " << sizeUnion << endl; return 0; }