C语言——构造类型

news2024/12/24 3:56:21

构造类型

数据类型分类

请添加图片描述

结构体

结构体的定义

  • 定义:自定义数据类型的一种,关键字 struct ,结构体类型的变量可以存储多个不同数据类型的数据。

  • 定义格式:

    struct 结构体名

    {

      数据类型1 成员名称1;

      数据类型2 成员名称2;

      …

    }

注意:结构体中定义的变量,我们称之为成员变量。

  • 格式说明:

    • 结构体名:合法的标识符,建议单词的首字母大写
    • 数据类型n:C语言支持的所有类型
    • 成员名称:合法的标识符,就是变量的命名标准
    • 数据类型n 成员名称n:类似于定义变量,定义了结构体中的成员
  • 注意:

  • 结构体在定义的时候,成员不能赋值

    • 举例:

      struct Cat
      {
          int age = 5;// 错误,结构体定义的时候,成员不能赋值
          double height; // 正确
      }
      
  • 常见的定义格式:

    • 方式1:常规定义(命名结构体,只定义类型)—推荐

      struct Student
      {
          int num;// 学号
          char name[20];// 姓名
          char sex;// 性别
          int age;// 年龄
          char address[100];// 家庭住址
      }
      
    • 方式2:定义匿名结构体(常用于作为其他结构体的成员使用)

      struct Dog
      {
          char *name;// 姓名
          int age;// 年龄
          struct // 此时这个结构体就是匿名
          {
              int year;// 年
              int month;// 月
              int day;// 日
          } birthday;
      }
      

      注意:定义匿名结构体的同时必须定义结构体变量,否则编译报错,结构体可以作为另一个结构体的成员。

总结:

  1. 结构体可以定义在局部位置,也可以定义在全局位置;

  2. 全局位置的结构体名和局部位置的结构体名可以相同,就近原则(和普通变量的定义同理)

  • 结构体类型的使用:

    利用结构体类型定义变量,定义数组;结构体类型的使用与基本数据类型的使用类似。

结构体变量的定义

  • 三种形式定义结构体变量:

    结构体变量也称为结构体的实力。

    • 第一种

      ① 先定义结构体

      ② 然后使用 struct 结构体名 变量名 ;

      // 先定义结构体(先定义结构体这个数据类型)
      struct A
      {
          int a;
          char b;
      }
      // 定义结构体变量
      struct A x;
      struct A y;
      
    • 第二种

      在定义结构体的同时,定义结构体变量;

      // 定义结构体的同时定义结构变量
      struct A
      {
          int a;
          char b;
      } x,y;
      struct A z;
      

      此时定义了一个结构体A,x和y是这个结构体类型的变量。

    • 第三种:不推荐

      在定义匿名结构体的同时,定义结构体变量;

      struct
      {
          int a;
          char b;
      } x,y;
      
      struct
      {
          int a;
          char b;
      } z;
      

      此时定义了一个没有名字的结构体(称为匿名结构体);y,x是这个匿名结构体类型的变量;

  • 匿名结构体:—弊大于利(尽量少用)

    • 优点:少写一个结构体名称

    • 缺点:只能使用一次;定义的结构体类型的同时就必须定义变量

    • 应用场景:

      • 当结构体的类型只需要使用一次,并且定义类型的同时定义变量。

      • 作为其他结构体的成员使用。

  • 定义结构体的同时,定义结构体变量初始化

    struct Cat
    {
        int age;
        char color[20];
    } cat;
    
    • 结构体成员部分初始化是,大括号不能省略。

    • 结构体的成员,没有默认值,是不确定的数

    案例:

    /**
    * 结构体变量的定义
    */
    #include <stdio.h>
    // 先定义结构体,再定义结构体变量
    void fun1()
    {
        // 先定义结构体
        struct A
        {
            int a;
            char b;
        };
        // 再定义结构体变量
        struct A x;
        struct A y;
    }
    // 定义结构体的同时定义结构体变量
    void fun2()
    {
        struct A
        {
            int a;
            char b;
        } x,y;
        struct A z;
    }
    
    // 定义匿名结构体的同时定义结构体变量
    void fun3()
    {
        struct
        {
            int a;
            char b;
        } x,y;
        struct
        {
            int a;
            char b;
        } z;
    }
    int main()
    {
        fun1();
        fun2();
        fun3();
        return 0;
    }
    

结构体变量的使用

  • 结构体变量访问结构体成员

    • 格式

      结构体变量名.成员名;
      

      可以通过访问给成员赋值(存数据)

      可以通过访问获取成员的值(取数据)

    • 结构体变量未初始化,结构体的成员值随机(不确定)

  • 结构体变量在定义时,可以初始化

    • 建议用大括号标明数据的范围

    • 结构体成员初始化时,可以部分初始化,部分初始化时一定要带大括号标明数据的范围

  • 案例:

    /**
    * 结构体变量的初始化
    */
    #include <stdio.h>
    /* 全局的结构体(数据类型) */
    struct Dog
    {
        char *name;// 姓名
        int age;// 年龄
        char sex;// M:公,W:母
    };
    /* 先定义,再初始化 */
    void fun1()
    {
        // 定义一个结构体
        // struct Dog
        // {
        // char *name;// 姓名
        // int age;// 年龄
        // char sex;// M:公,W:母
        // };
        // 定义结构体变量
        struct Dog dog;
        // 给结构体变量的成员赋值
        dog.name = "旺财";
        dog.age = 5;
        // 访问结构体变量的成员
        printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
    }
    /* 定义的同时初始化 */
    void fun2()
    {
        // 定义结构体变量并初始化
        struct Dog dog = {"招财",23,'M'};
        // 修改成员的值
        dog.name = "进宝";
        // 访问结构体变量的成员
        printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
    }
    int main()
    {
        fun1();
        fun2();
        return 0;
    }
    

结构体数组的定义

  • 什么时候需要结构体数组?

    • 比如:我们需要管理一个学生对象,只需要定义一个 struct Student majie;

    • 假如:我们需要管理多个学生对象,此时就需要一个结构体的数组 struct Student students[64]; 。

  • 三种形式定义结构体数组

    • 第一种:先定义结构体类型,然后定义结构体变量,再将变量存储到结构体数组中

      // 定义一个学生类型的结构体
      struct Student
      {
          char *name;
          int age;
          float scores[3];// 三门课程的成绩
      };
      
      // 定义结构体对象
      struct Student zhangsan = {"张三",23,{67.5,89.0,90.0}};
      struct Student lisi = {"李四",21,{77.0,80.0,85.0}};
      
      // 定义结构化数组
      struct Student students[3] = {zhangsan,lisi};
      
    • 第二种:定义结构体类型,然后定义结构体数组并初始化

      // 定义一个学生类型的结构体
      struct Student
      {
          int id;
          char *name;
          int age;
          float scores[3];// 三门课程的成绩
      };
      // 定义结构体数组并初始化
      struct Student students[3] = {
          {1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致
          {2,"李四",21,{77.0,80.0,85.0}}
      };
      
    • 第三种:定义结构体类型同时定义结构体数组并初始化

      // 定义一个学生类型的结构体
      struct Student
      {
          int id;
          char *name;
          int age;
          float scores[3];// 三门课程的成绩
      } ;
      	students[3] = {
          {1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致
          {2,"李四",21,{77.0,80.0,85.0}}
      };
      
    • 第四种:定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值

      // 定义一个学生类型的结构体
      struct Student
      {
          int id;
          char *name;
      	int age;
      	float scores[3];// 三门课程的成绩
      } sts[3];
      
      sts[0].id = 1;
      sts[0].name = "张三";
      sts[0].age = 12;
      sts[0].scores[0] = 98;
      

    小贴士:

    结构体数组名访问结构体成员:

,21,{77.0,80.0,85.0}}
};
```

  • 第四种:定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值

    // 定义一个学生类型的结构体
    struct Student
    {
        int id;
        char *name;
    	int age;
    	float scores[3];// 三门课程的成绩
    } sts[3];
    
    sts[0].id = 1;
    sts[0].name = "张三";
    sts[0].age = 12;
    sts[0].scores[0] = 98;
    

小贴士:

结构体数组名访问结构体成员:

格式:结构体数组名 -> 成员名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; func isSelfCrossing(distance []int) bool {n : len(distance)// 处理第 1 种情况i : 0for i < n && (i < 2 || distance[i] > distance[i-2]) {i}if i n {return false}// 处理第 j 次移动的情况if i 3 && di…

Mac系统如何下载安装Photoshop软件mac的新版指南!

Photoshop&#xff08;简称PS&#xff09;是一款广受欢迎的图像处理工具&#xff0c;在设计、摄影、广告等领域广泛应用。对于Mac用户&#xff0c;安装Photoshop可能会涉及到一些特殊的步骤。本文将为你提供在Mac上安装Photoshop的详细教程及常见问题的解决方案。 一、准备工作…

由微软开源GraphRAG加持的AI智能体,让律师变得更强大!

随着人工智能大模型时代的到来&#xff0c;LLM大语言模型、RAG增强检索、Graph知识图谱、Prompt提示词工程等技术的发展日新月异&#xff0c;也让各行各业更加期待技术带来的产业变革。 比如&#xff0c;法律行业&#xff0c;虽然通用大模型已经能够适配一些法律场景&#xff…

从自动化到智能化:物联网技术在转转智能质检中心的应用

1 背景2 物联网介绍 2.1 开篇故事2.2 物联网是什么2.3 物联网的基本组成 3 物联网技术选型和落地方案 3.1 应用层协议选型3.2 Broker 选型3.3 QoS 消息质量选型3.4 Broker 的部署方案 4 结语5 参考链接 1. 背景 在转转智能质检中心&#xff0c;随着业务的不断发展&#xff0c…

MQ死信对列

面试题&#xff1a;你们是如何保证消息不丢失的&#xff1f; 1、什么是死信 死信就是消息在特定场景下的一种表现形式&#xff0c;这些场景包括&#xff1a; 1. 消息被拒绝访问&#xff0c;即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常&#xff0…

vue3在高德地图中制作气象扇形雷达图

这是效果图&#xff0c;每隔22.5就会有一个扇形区域&#xff0c;有三层区域&#xff0c;第一层是距离圆点5km&#xff0c;第二层是10km&#xff0c;第三层是50km。 第一步&#xff1a;高德地图中绘画圆 // 构造矢量圆形let circle new AMap.Circle({center: position.value, …

rv1126-rv1109-读取mipi摄像头ID

1.有那个一个需求,需要读取mipi摄像头ID 起初,我以为很简单,实际非常复杂; 2.移植原有的逻辑,就是操作I2C函数读取ID寄存器,但是一直失败; 3.然后发现是电源没有打开;然后电源又是在DTS里面配置的 4.配置电源后发现要配置时钟 5.配置时钟后发现还要配置摄像头的上…

Vue框架学习笔记-7

Vue-cli项目中的mixin Vue-cli 项目中的 mixin 是一种强大的功能&#xff0c;允许你在多个组件之间共享可复用的方法和/或选项。Mixin 本质上是一个对象&#xff0c;它可以包含组件选项中的任意选项&#xff0c;如数据、方法、生命周期钩子等。当组件使用 mixin 时&#xff0c…

浙商证券社招入职人才测评:语言数字逻辑性格北森测评笔试题库高分答案、通关技巧

浙商证券作为一家综合性证券公司&#xff0c;其社会招聘的待遇情况包括但不限于以下几个方面&#xff1a;首先&#xff0c;公司提供具有竞争力的薪酬体系&#xff0c;其中应届生的平均薪资待遇大约在12K-20K之间&#xff0c;并且可能发放20个月的薪资&#xff0c;总包大约在25万…

好书推荐!这本Transformer书红的发紫,浅显易懂掌握大模型NLP技术!(附文档)

在大数据和人工智能时代&#xff0c;机器学习和深度学习已经成为各行各业解决问题的有效方法&#xff0c;自然语言处理&#xff0c;是深度学习的重要应用领域之一。 而自然语言处理这个研究领域在过去20年中发生了翻天覆地的变化&#xff0c;从传统的自然语言处理方法到深度学…

EcoDev Studio 与 gitlab【拉去项目,切换分支,再修改提交】

1 安装git工具 https://blog.csdn.net/mukes/article/details/115693833 2 创建空项目 3 推送gitlab 1、进入本地该项目目录下&#xff0c;右键Git Bash Here打开git命令窗口 2、初始化本地仓库&#xff1a; git init将本地项目的所有文件添加到暂存区&#xff1a; git a…

Django | 从中间件的角度理解跨站请求伪造(Cross-Site Request Forgey)[CSRF攻击]

文章目录 切入点案例测试views.py测试代码templates模板下的html文件配置路由运行服务 出现CSRF报错解决CRSF报错再次运行服务 查看结果 切入点 某些恶意网站上包含链接、表单按钮或者]avaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作 Gj…

好用的无线可视耳勺推荐:四大超有性价比产品集锦!

在生活中&#xff0c;耳部清洁是我们常常会关注却又容易忽视细节的一项日常护理。传统的挖耳勺比如棉签等等&#xff0c;有着不可视的局限性和操作失误的潜在风险。随着科技发展&#xff0c;无线可视耳勺逐步走进我们的视野&#xff0c;它结合了挖耳功能和内置摄像头&#xff0…

循环结构(四)——循环嵌套

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;所属专栏&#xff1a;C教程&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &a…

快速符合ISO26262产品认证——动力域L2监控方案精华分享

一、VCU应用层监控方案的ISO26262背景 “软件定义汽车”趋势下&#xff0c;更多汽车软件问题与消费者生命安全密切相关。而汽车行业ISO 26262《道路车辆功能安全》是一个国际安全标准&#xff0c;对安装在量产道路车辆上的电气、电子系统的功能安全进行了约束和规定&#xff0c…

C语言----约瑟夫环

约瑟夫环 实例说明&#xff1a; 本实例使用循环链表实现约瑟夫环。给定一组编号分别是4、7、5、9、3、2、6、1、8。报数初始值由用户输入&#xff0c;这里输入4&#xff0c;如图12.18所示&#xff0c;按照约瑟夫环原理打印输出队列。 实现过程&#xff1a; (1)在 VC6.0中创建…

整合springboot、mybatis-plus、做的电影的增删改查以及使用七牛云做图片的上传

一、建表 1.在数据库testdb库中新建一个movie表 2.表中的字段&#xff1a; mo_idmo_namemo_actormo_salespic_name 二、编写代码 1.第一步添加坐标 <properties><java.version>8</java.version></properties><dependencies><!--springspr…

一文带你快速了解——HAProxy负载均衡

一、HAProxy简介 1.1、什么是Haproxy HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计。…

用「画家流水线」的方式理解Transformer中间层

【导读】 Transformer架构层层堆叠&#xff0c;包含十几亿甚至几十亿个参数&#xff0c;这些层到底是如何工作的&#xff1f;当一个新奇的比喻——「画家流水线」&#xff0c;被用于类比并理解Transformer架构的中间层&#xff0c;情况突然变得明朗起来&#xff0c;并引出了一些…

基于 SpringCloud 分布式架构网上商城

目录 1绪论 4 1.1项目研究的背景 4 1.2开发意义 4 1.3课题研究现状 4 1.4项目研究内容与结构 5 2开发技术介绍 6 2.1Java技术 6 2.2 SpringCloud简介 6 2.3MySQL 介绍 7 2.4MySQL环境配置 7 2.5B/S架构 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.…