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

  • Title
  • Author
  • Subject
  • Book ID

定义结构

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

  1. struct tag {
  2. member-list
  3. member-list
  4. member-list
  5. ...
  6. } variable-list ;

tag 是结构体标签。
member-list是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。下面是声明 Book 结构的方式:

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

在一般情况下,tag、member-list、variable-list这 3 部分至少要出现 2 个。以下为实例:

  1. //此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
  2. //同时又声明了结构体变量 s1,s2,s3
  3. //这个结构体并没有标明其标签
  4. struct
  5. {
  6. int a;
  7. char b;
  8. double c;
  9. } s1,s2,s3;
  10. //此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
  11. //结构体的标签被命名为SIMPLE,没有声明变量
  12. struct SIMPLE
  13. {
  14. int a;
  15. char b;
  16. double c;
  17. };
  18. //用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
  19. struct SIMPLE t1, t2[20], *t3;
  20. //也可以用typedef创建新类型
  21. typedef struct
  22. {
  23. int a;
  24. char b;
  25. double c;
  26. } Simple2;
  27. //现在可以用Simple2作为类型声明新的结构体变量
  28. Simple2 u1, u2[20], *u3;

在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。

  1. //此结构体的声明包含了其他的结构体
  2. struct COMPLEX
  3. {
  4. char string[100];
  5. struct SIMPLE a;
  6. };
  7. //此结构体的声明包含了指向自己类型的指针
  8. struct NODE
  9. {
  10. char string[100];
  11. struct NODE *next_node;
  12. };

如果两个结构体互相包含,则需要对其中一个结构体先进行不完整声明,如下所示:

  1. struct B; //对结构体B进行不完整声明
  2. //结构体A中包含指向结构体B的指针
  3. struct A
  4. {
  5. struct B *partner;
  6. //other members;
  7. };
  8. //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
  9. struct B
  10. {
  11. struct A *partner;
  12. //other members;
  13. };

结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

  1. #include <stdio.h>
  2. struct Books
  3. {
  4. char title[50];
  5. char author[50];
  6. char subject[100];
  7. int book_id;
  8. } book = {"C 语言", "Ken", "编程语言", 123456};
  9. int main()
  10. {
  11. printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
  12. }
  13. /*
  14. title : C 语言
  15. author: Ken
  16. subject: 编程语言
  17. book_id: 123456
  18. */

访问结构成员

为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用struct关键字来定义结构类型的变量。下面的实例演示了结构的用法:

  1. #include <stdio.h>
  2. #include <string.h>
  3. struct Books
  4. {
  5. char title[50];
  6. char author[50];
  7. char subject[100];
  8. int book_id;
  9. };
  10. int main( )
  11. {
  12. struct Books Book1; // 声明 Book1,类型为 Books
  13. struct Books Book2; // 声明 Book2,类型为 Books
  14. // Book1 详述
  15. strcpy( Book1.title, "C Programming");
  16. strcpy( Book1.author, "Nuha Ali");
  17. strcpy( Book1.subject, "C Programming Tutorial");
  18. Book1.book_id = 6495407;
  19. // Book2 详述
  20. strcpy( Book2.title, "Telecom Billing");
  21. strcpy( Book2.author, "Zara Ali");
  22. strcpy( Book2.subject, "Telecom Billing Tutorial");
  23. Book2.book_id = 6495700;
  24. // 输出 Book1 信息
  25. printf( "Book 1 title : %s\n", Book1.title);
  26. printf( "Book 1 author : %s\n", Book1.author);
  27. printf( "Book 1 subject : %s\n", Book1.subject);
  28. printf( "Book 1 book_id : %d\n", Book1.book_id);
  29. // 输出 Book2 信息
  30. printf( "Book 2 title : %s\n", Book2.title);
  31. printf( "Book 2 author : %s\n", Book2.author);
  32. printf( "Book 2 subject : %s\n", Book2.subject);
  33. printf( "Book 2 book_id : %d\n", Book2.book_id);
  34. return 0;
  35. }
  36. /*
  37. Book 1 title : C Programming
  38. Book 1 author : Nuha Ali
  39. Book 1 subject : C Programming Tutorial
  40. Book 1 book_id : 6495407
  41. Book 2 title : Telecom Billing
  42. Book 2 author : Zara Ali
  43. Book 2 subject : Telecom Billing Tutorial
  44. Book 2 book_id : 6495700
  45. */

结构作为函数参数

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. struct Books
  4. {
  5. char title[50];
  6. char author[50];
  7. char subject[100];
  8. int book_id;
  9. };
  10. // 函数声明
  11. void printBook( struct Books book );
  12. int main( )
  13. {
  14. struct Books Book1; // 声明 Book1,类型为 Books
  15. struct Books Book2; // 声明 Book2,类型为 Books
  16. // Book1 详述
  17. strcpy( Book1.title, "C Programming");
  18. strcpy( Book1.author, "Nuha Ali");
  19. strcpy( Book1.subject, "C Programming Tutorial");
  20. Book1.book_id = 6495407;
  21. // Book2 详述
  22. strcpy( Book2.title, "Telecom Billing");
  23. strcpy( Book2.author, "Zara Ali");
  24. strcpy( Book2.subject, "Telecom Billing Tutorial");
  25. Book2.book_id = 6495700;
  26. printBook( Book1 ); // 输出 Book1 信息
  27. printBook( Book2 ); // 输出 Book2 信息
  28. return 0;
  29. }
  30. void printBook( struct Books book )
  31. {
  32. printf( "Book title : %s\n", book.title);
  33. printf( "Book author : %s\n", book.author);
  34. printf( "Book subject : %s\n", book.subject);
  35. printf( "Book book_id : %d\n", book.book_id);
  36. }
  37. /*
  38. Book title : C Programming
  39. Book author : Nuha Ali
  40. Book subject : C Programming Tutorial
  41. Book book_id : 6495407
  42. Book title : Telecom Billing
  43. Book author : Zara Ali
  44. Book subject : Telecom Billing Tutorial
  45. Book book_id : 6495700
  46. */

指向结构的指针

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

  1. struct Books *struct_pointer;

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

  1. struct_pointer = &Book1;

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

  1. struct_pointer->title;

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

  1. #include <stdio.h>
  2. #include <string.h>
  3. struct Books
  4. {
  5. char title[50];
  6. char author[50];
  7. char subject[100];
  8. int book_id;
  9. };
  10. // 函数声明
  11. void printBook( struct Books *book );
  12. int main( )
  13. {
  14. struct Books Book1; // 声明 Book1,类型为 Books
  15. struct Books Book2; // 声明 Book2,类型为 Books
  16. // Book1 详述
  17. strcpy( Book1.title, "C Programming");
  18. strcpy( Book1.author, "Nuha Ali");
  19. strcpy( Book1.subject, "C Programming Tutorial");
  20. Book1.book_id = 6495407;
  21. // Book2 详述
  22. strcpy( Book2.title, "Telecom Billing");
  23. strcpy( Book2.author, "Zara Ali");
  24. strcpy( Book2.subject, "Telecom Billing Tutorial");
  25. Book2.book_id = 6495700;
  26. printBook( &Book1 ); // 通过传 Book1 的地址来输出 Book1 信息
  27. printBook( &Book2 ); // 通过传 Book2 的地址来输出 Book2 信息
  28. return 0;
  29. }
  30. void printBook( struct Books *book )
  31. {
  32. printf( "Book title : %s\n", book->title);
  33. printf( "Book author : %s\n", book->author);
  34. printf( "Book subject : %s\n", book->subject);
  35. printf( "Book book_id : %d\n", book->book_id);
  36. }
  37. /*
  38. Book title : C Programming
  39. Book author : Nuha Ali
  40. Book subject : C Programming Tutorial
  41. Book book_id : 6495407
  42. Book title : Telecom Billing
  43. Book author : Zara Ali
  44. Book subject : Telecom Billing Tutorial
  45. Book book_id : 6495700
  46. */

结构体列表

  1. #include <stdio.h>
  2. struct Books
  3. {
  4. char title[50];
  5. char author[50];
  6. char subject[100];
  7. int book_id;
  8. } book = {"C 语言", "一缕清风", "编程语言", 123456};
  9. struct Books book2[2] =
  10. {
  11. {"C", "Ken", "编程语言", 666666},
  12. {"C", "Ken", "编程语言", 888888},
  13. };
  14. int main()
  15. {
  16. printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
  17. printf("\n");
  18. printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book2[0].title, book2[0].author, book2[0].subject, book2[0].book_id);
  19. }
  20. /*
  21. title : C 语言
  22. author: 一缕清风
  23. subject: 编程语言
  24. book_id: 123456
  25. title : C
  26. author: Ken
  27. subject: 编程语言
  28. book_id: 666666
  29. */