当前位置:   article > 正文

C语言struct用法_结构体struct初始化可以跳跃缺省

结构体struct初始化可以跳跃缺省

文章目录

前言

  • 一、结构体初始化
  • 二、结构体赋值
  • 三、结构体变量与指针
  • 四、为结构体定义简洁的类型名称(typedef)
  • 五、成员型运算符与指向型运算符
  • 六、结合智能车代码

相关链接


前言

整合struct的相关用法并结合智能车代码进行叙述


一、结构体初始化

无名结构体:

  1. /*
  2. 无名结构体定义时需要与
  3. 结构体变量/结构体数组变量/结构体指针一起定义
  4. 否则无法引用
  5. */
  6. struct{ //缺省结构体名
  7. int a;
  8. double b;
  9. *char c;
  10. }Nameless;

一般结构体:

  1. #define N 100
  2. /*一般结构体定义*/
  3. struct student{
  4. char name[10];
  5. int age;
  6. boolean sex;
  7. }stu,stu[N],*stu;
  8. //或者分开定义
  9. struct student{
  10. char name[10];
  11. int age;
  12. boolean sex; //0-女,1-男
  13. };
  14. struct student stu={"wkn",18,0};
  15. struct student stu[N];
  16. struct student *stu;
  17. //使用指针访问结构体成员
  18. stu=&stu; //前者为结构体指针*stu,后者为结构体变量stu
  19. //或 *stu=stu;
  20. //简略写法:struct student *stu=&stu;
  21. stu->age=8;
  22. (*stu).age=8;
  23. //涉及到成员型运算符与指向型运算符

 Attention:指针*stu与变量stu在使用时注意区分,一般来说C语言编译器是能够区分的

特殊结构体:

  (在比较复杂的数据管理系统中出现,大概?)

  1. /*特殊结构体*/
  2. //结构体中嵌套结构体
  3. struct birthday{
  4. int year;
  5. int month;
  6. int day;
  7. };
  8. struct student{
  9. char name[10];
  10. int age;
  11. bool sex;
  12. struct birthday birth;
  13. };

(结构体内包含指向自己的结构体指针,常在数据结构分析的链表、二叉树中出现)

  1. /*特殊结构体定义*/
  2. struct NODE{
  3. int value;
  4. struct NODE *NextNode;
  5. };

二、结构体赋值 

  1.初始化

      使用初始化的形式进行赋值

  1. /*初始化*/
  2. struct student stu={
  3. stu.name[10]="wkn";
  4. .age=18;
  5. .sex=0;
  6. };//初始化值时,加或不加结构体变量名都是可以的

  2.有序赋值

      上文中已有示范

struct student stu={"wkn",18,0};

  3.无序赋值

      即键值对类型

  1. /*结构体变量*/
  2. stu.age=18;
  3. /*结构体指针*/
  4. (*stu).age=18;
  5. stu->age=18;

三、结构体变量与指针

  1. struct student{
  2. char name[10];
  3. int age;
  4. bool sex;
  5. }stu,stu[N],*stu;

结构体变量,例:stu

可以理解为:我们把一个同学(变量)的信息(与此同学相关的信息)统一放在struct student中

结构体数组变量,例:stu[N]

一个班共有N位同学,那我们就把这N位同学放在stu[N]中,stu[0]的结构体就存放着第一位同学的 姓名,年龄,性别的信息,以此类推。

结构体指针,例:*stu

举例子,就像我们把N位同学的信息分别存放在一字排开的N个档案柜里,我们使用结构体指针去指向我们所需要寻找的那位同学的档案柜(地址),然后就可以使用运算符读取档案柜中的同学信息了。

四、为结构体定义简洁的类型名称(typedef)

假若我们按一般方法去调用结构体,过程大概如下:

  1. struct student{
  2. char name[10];
  3. int age;
  4. bool sex; //0-女,1-男
  5. };
  6. struct student stu={"wkn",18,0};
  7. //或者这样
  8. struct student{
  9. char name[10];
  10. int age;
  11. bool sex; //0-女,1-男
  12. }stu={"wkn",18,0};

在这里,结构体 struct student 为新的数据类型,在定义变量的时候均要像上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 student 来定义变量 

下面使用typedef定义结构体类型:

  1. typedef struct student{
  2. char name[10];
  3. int age;
  4. bool sex; //0-女,1-男
  5. }Stud;

这个过程也可以被拆分成两部分:

  1. struct student{
  2. char name[10];
  3. int age;
  4. bool sex; //0-女,1-男
  5. };//定义结构体
  6. typedef struct student Stud;//更改结构体类型名称为Stud
  7. //如此便可以直接用 Stud 代替 struct student
  8. Stud stu={"wkn",18,0};

五、成员型运算符与指向型运算符 

上文中同样有实例:

  1. /*第一种方式:使用成员型运算符*/
  2. stu.age=18;//这是结构体变量!!!
  3. (*stu).age=18;//结构体指针
  4. /*第二种方式:使用指向型运算符*/
  5. stu->age=18;//指针

六、结合智能车代码

看看代码中报的什么错(笑)

  1. // <typedef.h>
  2. typedef struct FlyWheel//动量轮PID参数结构体
  3. {
  4. float speedout; //速度外环输出(为角度)
  5. float angleout; //角度内环输出(为PWM)
  6. float gyro_out; //角速度环输出(为PWM)
  7. //速度环参数
  8. float speed_P;
  9. float speed_I;
  10. float speed_D;
  11. //角度环参数
  12. float angle_P;
  13. float angle_I;
  14. float angle_D;
  15. //角速度环参数
  16. float gyro_P;
  17. float gyro_I;
  18. float gyro_D;
  19. //平衡角
  20. float balance_A;
  21. float turn_increase;
  22. }PID_FlyWheel;
  1. // <typedef.c>
  2. #include "typede.h"
  3. struct FlyWheel PID_FlyWheel = { //飞轮结构体参数
  4. .speed_P = 1,
  5. .speed_I = 1,
  6. .speed_D = 0,
  7. .angle_P = 1,
  8. .angle_I = 0,
  9. .angle_D = 1,
  10. .gyro_P = 1,
  11. .gyro_I = 1,
  12. .gyro_D = 0,
  13. .balance_A = 1, //机械零点
  14. };

 不行?那看看四轮代码?!

  1. // <init.h>
  2. TRACK_TYPE_INFO g_TrackType; /*赛道类型*/
  3. // <image.h>
  4. typedef struct track_type_info_
  5. {
  6. uint32 m_u32CrossTime;
  7. //...
  8. } TRACK_TYPE_INFO;

相关链接:

typedef的用法,C语言typedef详解

结构体指针详解_编程图一乐的博客-CSDN博客_结构体指针

C语言的几种结构体Struct的赋值方法_从零开始的智障生活的博客-CSDN博客_c语言结构体赋值

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

闽ICP备14008679号