最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 单片机固件库中变量的定义方法图及解决办法(二)

    一、同时定义多个变量

    我们都知道C语言中变量的类型决定了变量存储所占用的空间。当我们要使用变量来保存年龄时,可以声明为int类型c语言结构体有什么用,而当我们要使用变量来保存科目的考试成绩时,可以声明为float。

    那么,当我们要做一个学生信息管理系统时,需要保存学生的姓名、学号、年龄等信息,我们应该怎么做呢?

    例如,当您要保存三个学生的信息时,

    方法一是:

    char *name1,*name2,*name3;  // 三个学生的姓名
    int num1,num2,num3;         // 三个学生的学号
    int age1,age2,age3;         // 三个学生的年龄

    第二种方法是:

    // 创建结构体模板
    struct student
    {
      char *name;  // 学生名字
      int num;     // 学生学号
      int age;     // 学生年龄
    };
    ​
    // 使用该结构体模板创建三个变量stu1, stu2, stu3
    struct student stu1, stu2, stu3;

    显然,第二种方法更清晰,因为它将name、num和age集成到一个模板中。当你想使用它时,你只需要应用模板来创建它。这是结构。

    二、什么是结构

    结构(struct)是由一系列相同类型或不同类型的数据项组成的数据集合。这些数据项称为结构的成员。例如,上面的student结构包含三个成员,分别是name、num和age。

    结构是 C 语言中的一种构造。C语言的数据类型如下:

    948add6bf4278c5165ac04afc7425dd1.png

    三、结构体变量方法1的定义方法

    // 创建结构体模板struct student
    struct student
    {
    char *name;  // 学生名字
    int num;     // 学生学号
    int age;     // 学生年龄
    };
    ​
    
    // 使用该结构体模板创建三个变量stu1, stu2, stu3
    struct student stu1, stu2, stu3;

    这里student为结构名,随意定义,但尽量取一个有意义的名字。相当于一个模板,可以用来定义变量stu1、stu2、stu3。定义时不要忘记结构。

    方法二

    // 定义三个结构体变量stu1, stu2, stu3
    struct
    {
    char *name;  // 学生名字
    int num;     // 学生学号
    int age;     // 学生年龄
    }stu1, stu2, stu3;

    与方法一相比,这里省略了结构名称。虽然更简洁,但是因为没有名字,所以以后不能用这个结构来定义新的变量。

    方法三

    // 给结构体模板struct student重新命名为student
    typedef struct student
    {
    char *name;  // 学生名字
    int num;     // 学生学号
    int age;     // 学生年龄
    }student;
    ​
    // 使用student创建三个结构体变量stu1, stu2, stu3
    student stu1, stu2, stu3;

    这里,typedef 用于为结构模板 struct student 定义一个别名 student。typedef的介绍移到之前的笔记:【C语言笔记】#define和typedef有什么区别?查看。使用typedef为结构体创建别名,在实际编程中被广泛使用,比如STM32单片机固件库,用的比较多,如下图:

    8e5c3b3f498dcb13309be29e53998271.png

    四、初始化结构

    初始化变量和数组如下:

    int count = 0;
    int arr[7] = {0,1,2,3,4,5,6};

    结构变量也可以这样初始化吗?是的,当然。类似于初始化数组的语法:

    struct student stu1 = 
    {
    

    用c语言f用c语言负数_c语言结构体有什么用_c语言程序设计与数据结构实践

    "ZhengN", // 名字:ZhengN 520, // 学号:520 99 // 年龄:99 };

    简而言之,我们使用一对花括号括起来的初始化列表进行初始化c语言结构体有什么用,每个初始化列表用逗号分隔。

    为了使初始化器与结构成员的关联更加明显,我们将每个成员的初始化器放在自己的行上。这只是为了提高代码的可读性。对于编译器,只需用逗号分隔每个成员的初始值设定项即可。

    C99 和 C11 为结构体提供了指定的初始化器。它的初始化器使用点运算符和成员名称。例如,要仅初始化学生结构的 name 成员,您可以这样做:

    struct student stu1 =
    {
       .name = "ZhengN"
    };

    指定初始化器也可以按任何顺序使用:

    struct student stu1 =
    {
       .age = 99,
       .num = 520,
       .name = "ZhengN"
    };

    此外,对特定成员的最后分配是它实际获得的值。例如,考虑以下代码:

    struct student stu1 =
    {
      .num = 520,
      .name = "ZhengN",
       1314
    };

    此时,分配给 num 的值应该是 1314,因为它跟在结构声明中的 name 成员之后。新值 1314 替换了之前的 520。

    指定初始化器也常用于实际编程中。比如在linux2.6.32.2源码的usb驱动中(路径为:linux-2.6.32.2driversusbstorageusb.c ),代码如下:

    a4ae58aa9d2e3239b4a2d7d528a3c2ae.png

    五、访问结构成员

    访问结构成员需要结构成员运算符 – 点 (.) 的帮助。喜欢:

    student stu1; // 定义一个结构体变量stu1
    stu1.name = "ZhengN";       // 给stu1的成员name赋值
    
    stu1.num = 520;             // 给stu1的成员num赋值
    stu1.age = 99;              // 给stu1的成员age赋值

    例子

    #include 
    ​
    typedef struct student
    {
     char *name;  // 学生名字
     int num;     // 学生学号
     int age;     // 学生年龄
    }student;
    ​
    int main(void)
    {
     student stu1;  // 定义一个结构体变量stu1
     
     /* 给结构体变量stu1的成员进行赋值 */
     stu1.name = "ZhengN";
     stu1.num = 520;
     stu1.age = 99;
     
     printf("n============================================n");
     printf("My name is %sn", stu1.name);
     printf("My num is %dn", stu1.num);
     printf("My age is %dn", stu1.age);
     printf("欢迎关注公号:嵌入式大杂烩!n", stu1.age);
     printf("============================================n");
    ​
     return 0;
    }

    运行程序的结果是:

    9d9c6b7508bd57c2f6d62c5c50bff710.png

    结构是一个非常重要的内容,被大量使用。关于结构体的内存对齐,可以查看之前的笔记:【C语言笔记】C语言结构体内存对齐问题

    站内大部分资源收集于网络,若侵犯了您的合法权益,请联系我们删除!
    欧资源网 » 单片机固件库中变量的定义方法图及解决办法(二)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论