当前位置:   article > 正文

C++ 结构(Struct)_c++ struct

c++ struct

一、结构介绍

        C语言中的结构(Structure)是一种用户自定义的复合数据类型,用于将不同类型的数据组合成一个单一的实体。结构允许您在一个数据结构中存储多个不同类型的数据,这些数据可以通过结构的成员来访问。

        以下是结构类型的数据

        

上面这一串结构类型虽然很长,但其就相当于 int 类型一样。 如同在 int 后填变量名可以声明一个整型变量。 ,在结构类型后面填写变量名可以声明一个 结构变量
  1. struct {
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. }timmy;

如在上述代码中,timmy 是由该结构声明的变量,它由4个成员组成。

使用成员运算符 . 加上 字段名 可以访问到结构的各个成员

  1. // 将Timmy的数据装入结构变量
  2. strcpy(timmy.name, "Timmy");
  3. timmy.gender = 1;
  4. timmy.height = 170.00;
  5. timmy.weight = 60;
  6. // 从结构变量中显示Timmy的数据
  7. printf("%s\n", timmy.name);
  8. printf("%d\n", timmy.gender);
  9. printf("%.2f\n", timmy.height);
  10. printf("%.2f\n", timmy.weight);

1.1、结构体别名

  1. struct {
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. }david;
  7. struct {
  8. char name[20];
  9. int gender;
  10. double height;
  11. double weight;
  12. }jane;
由于这几个结构变量的内部成员都是一致的,我们可以 声明一次结构类型 ,以便后续继续使用。
即可以给结构类型声明取一个 别名 在第一次声明结构变量时,在 struct { 之间可以填写一个 结构别名 。若以后再次需要使用这种结 构,仅需要使用 struct 别名 即可声明这种结构的变量。
如下图代码,声明一次结构体并取 person 为其别名,在需要多次调用结构体时,只需要 struct+person+变量名
  1. struct person{
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. }timmy;
  7. struct person david;
  8. struct person jane;

1.2、结构体初始化

结构变量初始化的形式和数组初始化的形式类似。
  1. int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  2. struct person{
  3. char name[20];
  4. int gender;
  5. double height;
  6. double weight;
  7. };
  8. //结构体初始化
  9. struct person timmy = {"timmy", 1, 170.00, 60.00};
  • 初始化列表由花括号包括。
  • 花括号内为结构成员需要被初始化的值。
  • 初始化值按照结构成员声明时的顺序依次排列
  • 每个初始化值之间由逗号分隔。

1.3、结构数组

结构数组与基本变量数组类似,使用方括号内填数组元素个数进行声明。

初始化列表也可用于初始化结构数组,初始化列表中依次填每个结构的初始化列表,每个结构的初始化列表之间由逗号分隔。

  1. struct person{
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. };
  7. struct person people[3] = {
  8. {"timmy", 1, 170.00, 60.00},
  9. {"david", 1, 175.00, 65.00},
  10. {"jane", 2, 165.00, 55.00}
  11. };

1.4、嵌套结构

即一个结构作为另外一个结构的成员
  1. struct contact {
  2. char phone[20];
  3. char email[20];
  4. };
  5. struct person{
  6. char name[20];
  7. int gender;
  8. double height;
  9. double weight;
  10. struct contact c;
  11. };
  12. //初始化
  13. struct person timmy = {
  14. "timmy", 1, 170.00, 60.00, {"130123456678", "timmy@xxx.com"}
  15. };

若想访问 结构 timmy中的 结构 contact里面的相关参数(phone、email),可以使用timmy.contact.phone的形式访问。如需打印出phone、 mail数据可参考下列操作

  1. printf("%s\n", timmy.c.phone);
  2. printf("%s\n", timmy.c.email);

1.5、指向结构的指针

指针可以指向基本类型数据也可以指向数组,结构也同样可以指向。

  1. struct person{
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. };
  7. struct person timmy = {"timmy", 1, 170.00, 60.00};
  8. struct person *pTimmy = &timmy;
  9. printf("%s\n", (*pTimmy).name);
  10. printf("%d\n", (*pTimmy).gender);
  11. printf("%.2f\n", (*pTimmy).height);
  12. printf("%.2f\n", (*pTimmy).weight);

和正常指针一样,加上星号 * 用于声明一个指针。使用取地址运算符&,可以获取指针。

使用指向结构的指针时,由于取地址 & 与取值 * 它们具有可逆关系,我们可以把指针先转为结构再使用。由于 成员运算符 . 的优先级高于取值 * ,为避免出现错误,需要将 *pTimmy 用()括起来。

另外,C语言中提供了更加方便的写法,即使用成员间接运算符   -> 。pTimmy->name等价于(*pTimmy).name 。

  1. printf("%s\n", pTimmy->name);
  2. printf("%d\n", pTimmy->gender);
  3. printf("%.2f\n", pTimmy->height);
  4. printf("%.2f\n", pTimmy->weight);

 1.6、结构在函数中传递

  1. struct person{
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. };
  7. void change(struct person per)
  8. {
  9. strcpy(per.name, "david");
  10. per.gender = 1;
  11. per.height = 175.00;
  12. per.weight = 65.00;
  13. }
  14. int main()
  15. {
  16. struct person timmy = {"timmy", 1, 170.00, 60.00};
  17. change(timmy);
  18. printf("%s\n", timmy.name);
  19. printf("%d\n", timmy.gender);
  20. printf("%.2f\n", timmy.height);
  21. printf("%.2f\n", timmy.weight);
  22. return 0;
  23. }

从上面的结果来看, 将结构当作参数传入函数。在函数内部修改传入的参数。 很显然,由于实参 timmy 与实参 per 是相互独立的。修改函数 change 内的 per 无法改动实参 timmy。

  1. struct person{
  2. char name[20];
  3. int gender;
  4. double height;
  5. double weight;
  6. };
  7. void change(struct person *per)
  8. {
  9. strcpy(per->name, "david");
  10. per->gender = 1;
  11. per->height = 175.00;
  12. per->weight = 65.00;
  13. }
  14. int main()
  15. {
  16. struct person timmy = {"timmy", 1, 170.00, 60.00};
  17. change(&timmy);
  18. printf("%s\n", timmy.name);
  19. printf("%d\n", timmy.gender);
  20. printf("%.2f\n", timmy.height);
  21. printf("%.2f\n", timmy.weight);
  22. return 0;
  23. }

从上图结果看,如果将 change 函数的参数改为指向结构的指针,情况就大不相同了。在函数 change 内部可以通过指针,找到结构变量 timmy 。并且对其进行修改。最后,将一个结构从函数返回也是可以的。从函数返回了david的数据,并且在将其赋值给了timmy。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/714845
推荐阅读
相关标签
  

闽ICP备14008679号