C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。 结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:

  • Title :标题
  • Author :作者
  • Subject :类目
  • Book ID :书的 ID

定义结构

为了定义结构,您必须使用struct语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

  1. struct type_name {
  2. member_type1 member_name1;
  3. member_type2 member_name2;
  4. member_type3 member_name3;
  5. .
  6. .
  7. } object_names;

type_name是结构体类型的名称
member_type1 member_name1是标准的变量定义,比如int i;或者float f;或者其他有效的变量定义。
在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,这是可选的。
下面是声明一个结构体类型Books,变量为book

  1. struct Books
  2. {
  3. char title[50];
  4. char author[50];
  5. char subject[100];
  6. int book_id;
  7. } book;
  1. struct Books book
  2. //或者
  3. Books book

结构体赋值

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. struct Books
  5. {
  6. char title[50];
  7. char author[50];
  8. string subject;
  9. int book_id = 123456; //默认值
  10. } book;
  11. int main(int argc, char const *argv[])
  12. {
  13. Books book1; //可以省略 struct
  14. strcpy( book1.title, "C++ 教程");
  15. strcpy( book1.author, "一缕清风");
  16. book1.subject = "编程语言";
  17. book1.book_id = 123456;
  18. struct Books book2 = {"C语言","kenguba","高级语言",123456};
  19. }

访问结构成员

为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。
下面的实例演示了结构的用法:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. // 声明一个结构体类型 Books
  5. struct Books
  6. {
  7. char title[50];
  8. char author[50];
  9. char subject[100];
  10. int book_id;
  11. };
  12. int main()
  13. {
  14. Books book1; // 定义结构体类型 Books 的变量 book1
  15. Books book2; // 定义结构体类型 Books 的变量 book2
  16. // book1 详述
  17. strcpy(book1.title, "C++ 教程");
  18. strcpy(book1.author, "一缕清风");
  19. strcpy(book1.subject, "编程语言");
  20. book1.book_id = 123456;
  21. // book2 详述
  22. strcpy(book2.title, "CSS 教程");
  23. strcpy(book2.author, "一缕清风");
  24. strcpy(book2.subject, "前端技术");
  25. book2.book_id = 123457;
  26. // 输出 book1 信息
  27. cout << "第一本书标题 : " << book1.title << endl;
  28. cout << "第一本书作者 : " << book1.author << endl;
  29. cout << "第一本书类目 : " << book1.subject << endl;
  30. cout << "第一本书 ID : " << book1.book_id << endl;
  31. // 输出 book2 信息
  32. cout << "第二本书标题 : " << book2.title << endl;
  33. cout << "第二本书作者 : " << book2.author << endl;
  34. cout << "第二本书类目 : " << book2.subject << endl;
  35. cout << "第二本书 ID : " << book2.book_id << endl;
  36. strcpy(book1.author, "Kebguba");
  37. strcpy(book2.author, "Kebguba");
  38. cout << "第一本书作者 : " << book1.author << endl; //Kebguba
  39. cout << "第二本书作者 : " << book2.author << endl; //Kebguba
  40. return 0;
  41. }
  42. /*
  43. 第一本书标题 : C++ 教程
  44. 第一本书作者 : 一缕清风
  45. 第一本书类目 : 编程语言
  46. 第一本书 ID : 123456
  47. 第二本书标题 : CSS 教程
  48. 第二本书作者 : 一缕清风
  49. 第二本书类目 : 前端技术
  50. 第二本书 ID : 123457
  51. 第一本书作者 : Kebguba
  52. 第二本书作者 : Kebguba
  53. */

结构作为函数参数 (传值形式)

您可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. void printBook(struct Books book);
  5. // 声明一个结构体类型 Books
  6. struct Books
  7. {
  8. char title[50];
  9. char author[50];
  10. char subject[100];
  11. int book_id;
  12. };
  13. int main()
  14. {
  15. Books book1; // 定义结构体类型 Books 的变量 book1
  16. Books book2; // 定义结构体类型 Books 的变量 book2
  17. // book1 详述
  18. strcpy(book1.title, "C++ 教程");
  19. strcpy(book1.author, "一缕清风");
  20. strcpy(book1.subject, "编程语言");
  21. book1.book_id = 123456;
  22. // book2 详述
  23. strcpy(book2.title, "CSS 教程");
  24. strcpy(book2.author, "一缕清风");
  25. strcpy(book2.subject, "前端技术");
  26. book2.book_id = 123457;
  27. printBook(book1); // 输出 book1 信息
  28. printBook(book2); // 输出 book2 信息
  29. cout << "书作者 : " << book1.author << endl; //一缕清风
  30. cout << "书作者 : " << book2.author << endl; //一缕清风
  31. return 0;
  32. }
  33. void printBook(struct Books book)
  34. {
  35. cout << "书标题 : " << book.title << endl;
  36. cout << "书作者 : " << book.author << endl;
  37. cout << "书类目 : " << book.subject << endl;
  38. cout << "书 ID : " << book.book_id << endl;
  39. strcpy(book.author, "Kenguba");
  40. cout << "书作者 : " << book.author << endl; //Kenguba
  41. }
  42. /*
  43. 书标题 : C++ 教程
  44. 书作者 : 一缕清风
  45. 书类目 : 编程语言
  46. 书 ID : 123456
  47. 书作者 : Kenguba
  48. 书标题 : CSS 教程
  49. 书作者 : 一缕清风
  50. 书类目 : 前端技术
  51. 书 ID : 123457
  52. 书作者 : Kenguba
  53. 书作者 : 一缕清风
  54. 书作者 : 一缕清风
  55. */

指向结构的指针 (地址传递)

您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:

  1. struct Books *struct_pointer;

现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:

  1. struct_pointer = &Book1;

为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:

  1. struct_pointer->title;

让我们使用结构指针来重写上面的实例,这将有助于您理解结构指针的概念:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. void printBook(struct Books *book);
  5. struct Books
  6. {
  7. char title[50];
  8. char author[50];
  9. string subject;
  10. int book_id;
  11. };
  12. int main()
  13. {
  14. struct Books book1 = {"C++ 教程", "Runoob", "编程语言", 12345};
  15. Books book2;
  16. strcpy(book2.title, "CSS 教程");
  17. strcpy(book2.author, "Runoob");
  18. book2.subject = "前端技术";
  19. book2.book_id = 12346;
  20. printBook(&book1); // 通过传 book1 的地址来输出 book1 信息
  21. printBook(&book2); // 通过传 book2 的地址来输出 book2 信息
  22. cout << "书作者 : " << book1.author << endl; //Kenguba
  23. cout << "书作者 : " << book2.author << endl; //Kenguba
  24. return 0;
  25. }
  26. // 该函数以结构指针作为参数
  27. void printBook(struct Books *book)
  28. {
  29. cout << "书标题 : " << book->title << endl;
  30. cout << "书作者 : " << book->author << endl;
  31. cout << "书类目 : " << book->subject << endl;
  32. cout << "书 ID : " << book->book_id << endl;
  33. strcpy(book->author, "Kenguba");
  34. cout << "书作者 : " << book->author << endl; //Kenguba
  35. }
  36. /*
  37. 书标题 : C++ 教程
  38. 书作者 : Runoob
  39. 书类目 : 编程语言
  40. 书 ID : 12345
  41. 书作者 : Kenguba
  42. 书标题 : CSS 教程
  43. 书作者 : Runoob
  44. 书类目 : 前端技术
  45. 书 ID : 12346
  46. 书作者 : Kenguba
  47. 书作者 : Kenguba
  48. 书作者 : Kenguba
  49. */

结构体数组

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. struct Student
  5. {
  6. string name; //姓名
  7. int age; //年龄
  8. int score; //分数
  9. };
  10. typedef struct Stu
  11. {
  12. string name; //姓名
  13. int age; //年龄
  14. int score; //分数
  15. } S;
  16. int main(int argc, char const *argv[])
  17. {
  18. Student s1; //可以省略struct
  19. s1.name = "一缕清风";
  20. s1.age = 18;
  21. s1.score = 99;
  22. cout << s1.age << "岁的" << s1.name << "的分数是" << s1.score << endl;
  23. S arr[3] = {
  24. {"张三", 18, 80},
  25. {"李四", 32, 92},
  26. {"王五", 14, 100},
  27. };
  28. arr[0].name = "一缕清风"; //修改结构体数组的某项名字的值
  29. for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  30. {
  31. cout << arr[i].name + "\t" << arr[i].age << "\t" << arr[i].score << endl;
  32. }
  33. }
  34. /*
  35. 一缕清风 18 80
  36. 李四 32 92
  37. 王五 14 100
  38. */

typedef 关键字

下面是一种更简单的定义结构的方式,您可以为创建的类型取一个”别名”。例如:

  1. typedef struct Books
  2. {
  3. char title[50];
  4. char author[50];
  5. char subject[100];
  6. int book_id;
  7. } Books;

现在,您可以直接使用Books来定义Books类型的变量,而不需要使用 struct 关键字。下面是实例:

  1. Books Book1, Book2;

您可以使用typedef关键字来定义非结构类型,如下所示:

  1. typedef long int *pint32;
  2. pint32 x, y, z;

x, y 和 z 都是指向长整型 long int 的指针。