结构体的介绍
结构体(struct)是C语言中用于封装多种数据类型的重要工具,其定义方式灵活且功能强大。结构体的核心目的是将不同类型的数据组合成一个整体。
结构体的应用场景
-
数据封装: 将姓名、学号等不同类型的相关数据组合成一个有意义的“整体”,便于管理和传递(如表示学生、日期、点)。
-
复杂数据结构基础: 作为构建链表、树、图等高级数据结构的基本单元。
-
函数参数/返回值: 简化函数间多参数或多结果的传递。
-
硬件/文件映射: 在嵌入式或文件I/O中,精确映射内存或文件的数据布局。
-
C++ 中类的简化版: 在 C++ 中,
struct
可包含函数,默认成员为public
,常用于表示纯数据结构。
结构体的基本语法框架
struct [结构体标签] {
数据类型 成员1;
数据类型 成员2;
// ...
} [变量列表];
-
struct
:关键字,标识结构体类型。 -
结构体标签(可选):用于后续引用该结构体类型(如定义新变量)。
-
成员列表:包含不同数据类型的变量声明。
-
变量列表(可选):可直接在此处定义结构体变量。
-
特性:
- 成员可以是任意数据类型(如
int
、char
、数组,甚至其他结构体)。 - 结构体变量的大小由成员总大小及内存对齐规则决定。
- 成员可以是任意数据类型(如
结构体定义的四种典型方式
标准方式(声明与定义分离)
特点
先声明结构体类型,再定义变量,适应于全局或多次使用。
格式
-
带有标签(tag)或名称的结构体定义格式:
struct 结构体名称{ 变量类型 变量名; 变量类型 变量名; ......; };
-
结构体声明格式:
结构体名称 变量名;
-
赋值结构体成员:
声明的变量名.结构体中的变量名 = 变量值;
示例1
- 代码
#include <iostream> using namespace std; struct Book { string title; string author; }; int main() { struct Book book1; // C语言需加struct,C++可省略 Book book2; // C++中直接使用类型名 book2.title = "三国演义"; book2.author = "罗贯中"; cout << "书名: " << book2.title << endl; cout << "作者: " << book2.author << endl; return 0; }
- 运行
书名: 三国演义 作者: 罗贯中
声明时直接定义变量
特点
简洁,在结构体声明后直接创建变量,适合一次性使用。
格式
-
声明结构体类型时直接定义变量的格式:
struct 结构体名称{ 变量类型 变量名; 变量类型 变量名; ......; }变量名,变量名,......;
-
赋值结构体成员:
声明的变量名.结构体中的变量名 = 变量值;
示例1
- 代码
#include <iostream> using namespace std; struct Book { string title; string author; }a,b; int main() { a.title = "三国演义"; a.author = "罗贯中"; b.title = "水浒传"; b.author = "施耐庵"; cout << "书名: " << a.title << endl; cout << "作者: " << a.author << endl; cout << endl; cout << "书名: " << b.title << endl; cout << "作者: " << b.author << endl; return 0; }
- 运行
书名: 三国演义 作者: 罗贯中 书名: 水浒传 作者: 施耐庵
匿名结构体
特点
无类型名,仅能通过变量访问,适用于局部简单场景
格式
-
匿名结构体定义并直接声明变量
struct { 变量类型 变量名; 变量类型 变量名; ......; }变量名,变量名,......;
-
赋值结构体成员:
声明的变量名.结构体中的变量名 = 变量值;
示例1
- 代码
#include <iostream> using namespace std; struct { string title; string author; }a,b; int main() { a.title = "三国演义"; a.author = "罗贯中"; b.title = "水浒传"; b.author = "施耐庵"; cout << "书名: " << a.title << endl; cout << "作者: " << a.author << endl; cout << endl; cout << "书名: " << b.title << endl; cout << "作者: " << b.author << endl; return 0; }
- 运行
书名: 三国演义 作者: 罗贯中 书名: 水浒传 作者: 施耐庵
使用typedef
别名简化
特点
通过typedef
为结构体创建别名,增强代码可读性(C风格)。
格式
-
普通结构体别名简化
typedef struct 结构体名称{ // 成员 }新的类别名;
-
匿名结构体别名简化
typedef struct{ // 成员 }新的类型别名;
-
结构体声明格式:
结构体名称 变量名;
-
赋值结构体成员:
声明的变量名.结构体中的变量名 = 变量值;
示例1
- 代码
#include <iostream> using namespace std; typedef struct { string title; string author; }Book; int main() { Book a; Book b; a.title = "三国演义"; a.author = "罗贯中"; b.title = "水浒传"; b.author = "施耐庵"; cout << "书名: " << a.title << endl; cout << "作者: " << a.author << endl; cout << endl; cout << "书名: " << b.title << endl; cout << "作者: " << b.author << endl; return 0; }
- 运行
书名: 三国演义 作者: 罗贯中 书名: 水浒传 作者: 施耐庵
示例2
- 代码
#include <iostream> #include <string> using namespace std; struct Book{ string title; string author; }; typedef Book shuji; int main(){ shuji book1 = {"三国演义","罗贯中"}; shuji book2 = {"水浒传","施耐庵"}; shuji book3 = {"红楼梦","曹雪芹"}; shuji book4 = {"西游记","吴承恩"}; shuji book[] = {book1, book2, book3, book4}; for(int i = 0 ; i < 4; ++i){ cout << "书名:" << book[i].title << ' ' << "作者:" << book[i].author << endl; } return 0; }
- 运行
书名:三国演义 作者:罗贯中 书名:水浒传 作者:施耐庵 书名:红楼梦 作者:曹雪芹 书名:西游记 作者:吴承恩
C++对结构体的扩展
包含成员函数
特点:C++结构体可封装函数,默认访问权限为public
,与类(class
)相似但权限不同
示例
- 代码
#include <iostream> using namespace std; struct Book{ string title; string author; // 成员函数:用于设置书名和作者 // 参数是 const string& 类型,避免不必要的复制,提高效率 void setDetails(const string& newTitle, const string& newAuthor) { title = newTitle; author = newAuthor; } // 成员函数:用于打印图书信息 void printInfo(){ cout << "书名: " << title << endl; cout << "作者: " << author << endl; } }a,b; int main() { a.setDetails("三国演义","罗贯中"); b.setDetails("水浒传","施耐庵"); a.printInfo(); cout << endl; b.printInfo(); cout << endl; b.setDetails("红楼梦","曹雪芹"); b.printInfo(); return 0; }
- 运行
书名: 三国演义 作者: 罗贯中 书名: 水浒传 作者: 施耐庵 书名: 红楼梦 作者: 曹雪芹
初始化与赋值
直接初始化:声明变量时赋值
示例
- 代码
#include <iostream> using namespace std; struct Book{ string title; string author; // 成员函数:用于设置书名和作者 // 参数是 const string& 类型,避免不必要的复制,提高效率 void setDetails(const string& newTitle, const string& newAuthor) { title = newTitle; author = newAuthor; } // 成员函数:用于打印图书信息 void printInfo(){ cout << "书名: " << title << endl; cout << "作者: " << author << endl; } }; int main() { Book a = {"三国演义","罗贯中"}; // C++11 风格的直接初始化 (带=号) // 或者不带=号也可以,效果相同 Book b{"水浒传","施耐庵"}; // C++11 风格的直接初始化 (不带=号) a.printInfo(); cout << endl; b.printInfo(); cout << endl; b = {"红楼梦","曹雪芹"}; b.printInfo(); return 0; }
- 运行
书名: 三国演义 作者: 罗贯中 书名: 水浒传 作者: 施耐庵 书名: 红楼梦 作者: 曹雪芹
动态分类内存
动态内存分配:结合指针操作
示例
- 代码
#include <iostream> using namespace std; struct Book{ string title; string author; // 成员函数:用于设置书名和作者 // 参数是 const string& 类型,避免不必要的复制,提高效率 void setDetails(const string& newTitle, const string& newAuthor) { title = newTitle; author = newAuthor; } // 成员函数:用于打印图书信息 void printInfo(){ cout << "书名: " << title << endl; cout << "作者: " << author << endl; } }; int main() { // 1. 动态分配单个内存 Book* a = new Book; Book* b = new Book; a -> setDetails("三国演义","罗贯中"); b -> setDetails("水浒传","施耐庵"); a -> printInfo(); cout << endl; b -> printInfo(); cout << "--------------------" << endl; // 2. 动态分配 Book 结构体数组 Book* bookarray = new Book[3]; bookarray[0].setDetails("百年孤独","加西亚·马尔克斯"); bookarray[1].setDetails("傲慢与偏见","简·奥斯汀"); bookarray[2].setDetails("杀死一只知更鸟","哈珀·李"); for(int i = 0; i < 3; ++i){ bookarray[i].printInfo(); cout << endl; } delete a; delete b; delete[] bookarray; a = nullptr; b = nullptr; bookarray = nullptr; return 0; }
- 运行
书名: 三国演义 作者: 罗贯中 书名: 水浒传 作者: 施耐庵 -------------------- 书名: 百年孤独 作者: 加西亚·马尔克斯 书名: 傲慢与偏见 作者: 简·奥斯汀 书名: 杀死一只知更鸟 作者: 哈珀·李