当前位置:   article > 正文

struct用法(C语言)_struct在c语言中用法

struct在c语言中用法

目录

定义:

定义形式:

结构体数据赋值方法:

使用typedef定义结构体:


定义:

struct即结构体,亦被直接称为“结构”。实际编程时,经常需要用相关的不同类型的数据来描述一个数据对象。例如,描述学生的综合信息时,需要使用学生的学号、姓名、性别、成绩以及家庭住址等不同类型的数据。但是,用相关的不同类型的数据来描述一个数据对象会使编程极为不便。因此,C语言提供了一种称为结构体(struct)的数据类型,以描述需要不同类型数据的数据对象。(摘自百度百科)

定义形式:

据我试验,结构体有3种定义方法(在不考虑使用typedef的情况下):

①:struct         [结构体名]        

{

[成员1数据类型]         [成员1名称];

[成员2数据类型]         [成员2名称];

[...]

}  ;

②:struct    

{

[成员1数据类型]         [成员1名称];

[成员2数据类型]         [成员2名称];

[...]

}    [结构体变量名标识符(类似int a;中的a是一个标识符)];

③:struct         [结构体名]        

{

[成员1数据类型]         [成员1名称];

[成员2数据类型]         [成员2名称];

[...]

}    [ 结构体变量名标识符(类似int a;中的a是一个标识符)];

那么,这几种有什么区别呢?

①是只定义了一个名字为[结构体名]的结构体类型,我们可以通过struct [结构体名]  [标识符]

的形式在需要的地方定义一个这种数据类型的变量。

②是只定义了一个这种结构体类型的数据,如果我们用这种方式的话,我们就只能在这里定义这种数据类型的变量。

③则是①和②的结合体。

我们通过一段代码来认识它们:

  1. #include <stdio.h>
  2. struct stu1
  3. {
  4. char name[10];
  5. int age;
  6. };
  7. struct
  8. {
  9. char name[10];
  10. int age;
  11. }stu2x={"李四",22};
  12. struct stu3
  13. {
  14. char name[10];
  15. int age;
  16. }stu3x;
  17. struct stus
  18. {
  19. struct stu3 sstu3x;
  20. }stusx;
  21. int main()
  22. {
  23. struct stu1 stu1x={"张三",21};
  24. struct stu3 stu3y={"赵六",24};
  25. // stu2x={"李四",22};
  26. stu3x.age=23;
  27. strcpy(stu3x.name,"王五"); //字符串赋值的一种方法,因为无法直接等于
  28. stusx.sstu3x.age=3000;
  29. strcpy(stusx.sstu3x.name,"七七");
  30. printf("姓名:%s 年龄:%d\n",stu1x.name,stu1x.age);
  31. printf("姓名:%s 年龄:%d\n",stu2x.name,stu2x.age);
  32. printf("姓名:%s 年龄:%d\n",stu3x.name,stu3x.age);
  33. printf("姓名:%s 年龄:%d\n",stu3y.name,stu3y.age);
  34. printf("姓名:%s 年龄:%d\n",stusx.sstu3x.name,stusx.sstu3x.age);
  35. printf("%d %d %d\n",sizeof(stu1x),sizeof(stu2x),sizeof(stu3x));
  36. return 0;
  37. }

    那么,我们实际上用那种呢?其实我们这三种都不用,因为我们还有一个关键字(typedef)可以用,在typedef一节会讲到。

结构体数据赋值方法:

①:定义时赋值,就是在定义变量后,直接用={[成员1数据],[成员2数据],...};

这种赋值方法只适用于定义时,定义后这样赋值就会报错。

②:通过[结构体变量名标识符(类似int a;中的a是一个标识符)]. [成员n名称]=[成员n数据],这种方法也有一个缺陷,就是字符串无法直接赋值,需要使用strcpy之类的函数。最后就是当结构体中的成员也是结构体时,我们直接.下去套娃即可,上面的代码均可体现。

使用typedef定义结构体

typedef是将定义复杂的声明定义成简单的别名,便于记忆和再次定义变量时使用。

在结构体中就是将定义的结构体类型用一个新的别名代替。

它也有有两种:

①:typedef struct    

{

[成员1数据类型]         [成员1名称];

[成员2数据类型]         [成员2名称];

[...]

}    [别名];

②:typedef  struct         [结构体名]        

{

[成员1数据类型]         [成员1名称];

[成员2数据类型]         [成员2名称];

[...]

}    [别名];

它们与结构体定义的②和③相似,区别是在最前面加了typedef,后面的 [结构体变量名标识符(类似int a;中的a是一个标识符)]换成了[别名],然后就是后面不能定义变量。

这个也很好理解:先看一段语句:typedef unsigned int uint32_t;

这段语句中unsigned int就相当于typedef  struct         [结构体名],uint32_tt就相当于[别名],至于这(typedef unsigned int uint32_t)后面不能定义变量应该都知道吧。

同时,typedef定义结构体①和②的区别也就一目了然了,就是②可以用struct [结构体名] 的形式去定义结构体变量,但是我都用typedef了,还需要这个?,所以用第一种就行。

最后也给出一段代码:

  1. #include <stdio.h>
  2. typedef struct stut1
  3. {
  4. char name[10];
  5. int age;
  6. }stut1x;
  7. typedef struct
  8. {
  9. char name[10];
  10. int age;
  11. }stut2x ;
  12. int main()
  13. {
  14. struct stut1 stut1xx={"张三",21};
  15. stut1x stut1xy={"李四",22};
  16. stut2x stut2xy={"王五",23};
  17. printf("姓名:%s 年龄:%d\n",stut1xx.name,stut1xx.age);
  18. printf("姓名:%s 年龄:%d\n",stut1xy.name,stut1xy.age);
  19. printf("姓名:%s 年龄:%d\n",stut2xy.name,stut2xy.age);
  20. return 0;
  21. }

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

闽ICP备14008679号