
点击蓝字 关注我们

第十节 结构体基础

结构体(Struct)是一种用户自定义的数据类型,允许将不同类型的数据组合在一起,形成一个单一的数据结构。结构体中的成员可以是各种基本数据类型(如整数、浮点数、字符等),也可以是其他结构体或数组。
struct 结构体名{变量一;变量二;......;};
接下来定义一个学生结构体:
#include<iostream>using namespace std;#include<string>//字符串头文件struct students//定义结构体{string name;int age;string sex;};int main(){students S1;//创建结构体变量S1.name = "Rose";// 初始化结构体成员第一种方式S1.age = 20;S1.sex = "女";cout << "S1:" << "\t" << "姓名:" << S1.name <<"\t"<< "年龄:" << S1.age <<"\t" << "性别:" << S1.sex << endl;students S2 = { "XDOne",21,"男" };//第二种方式:必须按照定义时的顺序初始化cout << "S2:" << "\t" << "姓名:" << S2.name << "\t"<< "年龄:" << S2.age << "\t" << "性别:" << S2.sex << endl;system("pause");return 0;}
结果如下:
S1: 姓名:Rose 年龄:20 性别:女S2: 姓名:XDOne 年龄:21 性别:男
students是一个结构体,包含了姓名(name)、年龄(age)和性别(sex)这三个成员。在 main 函数中,我们创建了两个 students 类型的结构体变量,分别为 S1 和 S2,并通过点运算符(.)访问和修改结构体的成员。
结构体数组
结构体数组允许将相关的数据项组织在一起,形成一个更为结构化的数据集。这对于表示一组相似对象(如学生、员工)的信息是非常有用的。
#include<iostream>using namespace std;#include<string>//字符串头文件struct students//定义结构体{string name;int age;string sex;};int main(){students S[3] = {{"Rose",20,"女"},{"XDOne",21,"男"},{"Mily",23,"女"}};for (int i=0; i <3; i++){cout << "S" << i << ":" << "\t" << "姓名:" << S[i].name << "\t"<< "年龄:" << S[i].age << "\t"<< "性别:" << S[i].sex << endl;}system("pause");return 0;}
结果如下:
S0: 姓名:Rose 年龄:20 性别:女S1: 姓名:XDOne 年龄:21 性别:男S2: 姓名:Mily 年龄:23 性别:女
结构体数组通过索引方式存储数据,这使得可以通过循环轻松遍历数组中的元素。这对于处理大量数据或实现搜索算法等操作很方便。
结构体指针
结构体指针是指向结构体变量的指针,它可以用于操作结构体的成员,以及通过动态内存分配创建和访问结构体对象。
#include<iostream>using namespace std;#include<string>//字符串头文件struct Person//定义结构体{string name;int age;int telephone;};int main(){Person p1 = { "Rose",20,14138 }; // 定义结构体变量Person* ptrPerson = &p1;cout << "p1:" << "\t" << "姓名:" << ptrPerson->name << "\t"<< "年龄:" << ptrPerson->age << "\t"<< "电话号码:" << ptrPerson->telephone << endl;system("pause");return 0;}
结果如下:
p1: 姓名:Rose 年龄:20 电话号码:14138
结构体指针通过箭头运算符 (->) 来访问结构体成员,这相当于通过指针解引用并访问成员。在动态分配内存时,可以使用 new 运算符创建结构体对象,然后通过指针访问和操作其成员,最后使用 delete 释放内存。
#include<iostream>using namespace std;#include<string>//字符串头文件struct Person//定义结构体{string name;int age;int telephone;};int main(){Person* ptrPerson = new Person;//动态分配结构体对象ptrPerson->name = "Mily"; // 使用指针访问结构体成员并赋值ptrPerson->age = 23;ptrPerson->telephone = 16158;// 输出结构体成员cout << "p1:" << "\t" << "姓名:" << ptrPerson->name << "\t"<< "年龄:" << ptrPerson->age << "\t"<< "电话号码:" << ptrPerson->telephone << endl;delete ptrPerson;// 释放动态分配的内存system("pause");return 0;}
p1: 姓名:Mily 年龄:23 电话号码:16158
结构体指针的优点
结构体指针相对于普通结构体有一些优点,尤其在涉及到动态内存分配、传递和操作结构体的情况下。
动态内存分配:结构体指针允许在运行时动态分配内存,从而创建动态大小的结构体对象。这使得在程序执行期间根据需要创建和释放结构体对象成为可能。代码如上个例子。
动态结构体数组:结构体指针使得创建动态大小的结构体数组变得容易。通过动态分配内存,并使用指针来访问数组中的不同元素,可以在运行时灵活地管理数组的大小。
传递结构体:通过传递结构体指针,而不是整个结构体,可以避免在函数调用中复制整个结构体的开销,提高程序的效率。
#include<iostream>using namespace std;#include<string>//字符串头文件struct Person//定义结构体{string name;int age;int telephone;};void showPerson(const Person*ptrPerson)//使用结构体指针传递结构体{cout << "p1:" << "\t" << "姓名:" << ptrPerson->name << "\t"<< "年龄:" << ptrPerson->age << "\t"<< "电话号码:" << ptrPerson->telephone << endl;}int main(){Person p1 = { "Rose",20,14138 };showPerson(&p1);// 通过指针传递结构体system("pause");return 0;}
在这个例子中,在函数参数中使用 const
修饰指针,表示指针指向的内容是常量,不可修改。我们希望声明一个带有参数的函数,并明确表明该函数不会修改传入的参数的值。这时可以使用 const
修饰函数的参数。在函数声明和定义中,将参数声明为 const
表示该参数是只读的,即函数内部不能修改这个参数的值。这样的声明和定义使得函数更安全,因为它确保了在函数内部不会无意间修改传入的参数。
结果如下:
p1: 姓名:Rose 年龄:20 电话号码:14138
typedef关键字
用来为数据类型定义别名的关键字。通过 typedef,可以为已有的数据类型创建一个新的名称,提高代码的可移植性。
typedef 已存在类型名 别名
上述例子中使用typedef Person student,就可在主函数中初始化一个student类型,实质上就是Person。
END
往期推荐




