C语言——构造类型

构造类型

数据类型分类

请添加图片描述

结构体

结构体的定义

  • 定义:自定义数据类型的一种,关键字 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.rhkb.cn/news/400530.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-plus的表单输入框有清除按钮的,文字输入前后宽度不一致怎么解决

输入内容之后多了一个可清除的图标&#xff0c;输入框的宽度也被撑开了 根据输入前后的dom对比发现&#xff0c;多了一个图标的span标签 :deep(.el-input__wrapper) {position: relative;.el-input__inner {padding-right: 18px;}.el-input__suffix {position: absolute;right:…

【qmake: No such file or directory 的问题解决最全】

尝试1 qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory 执行 qmake -v出现错误&#xff1a;qmake: could not exec ‘/usr/lib/x86_64-linux-gnu/qt4/bin/qmake’: No such file or directory 分析&#xff1a; qtchooser默…

【简历】北京某985大学:JAVA秋招简历指导,面试通过率较高

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 我们今天要看一位来自25届985同学的JAVA简历。 既然要参加校招的话&#xff0c;我们校招法典的第一准则&#xff1a;定你的学校层次。 …

Java面试八股之什么是消息队列

什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用程序间通信&#xff08;IPC&#xff09;的形式&#xff0c;它允许进程将消息发送到另一个消息队列&#xff0c;接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…

java后端正式的企业级项目规范——苍穹外卖篇一

我在极速一个月学完黑马的《java web》课程之后跟着他写了一个java后端项目&#xff0c;但是后面我才发现那只是为了巩固基础的一个简单课程项目&#xff0c;跟实际开发的项目根本不一样。然后后面我暑假去了超星的移动图书馆开发部实习&#xff08;我主要做前端的&#xff09;…

深度优化Nginx负载均衡策略,携手Keepalived打造高可用服务架构新纪元

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#…

【JavaEE初阶】文件操作和IO

目录 &#x1f334;认识文件 &#x1f6a9;树型结构组织和目录 &#x1f6a9;文件路径&#xff08;Path&#xff09; &#x1f6a9; 文件分类 &#x1f38d;Java 中操作文件 &#x1f6a9; File 概述&#xff1a; &#x1f4cc;属性 &#x1f4cc;构造方法 &#x1f4c…

企业大模型业务架构技术选型分析

AI赋能企业&#xff1a;选择适合你的大模型业务架构 现代企业中&#xff0c;大模型业务日益普及&#xff0c;主要涵盖AI Embedded、AI Copilot和AI Agent三大架构。本文深入剖析其特性与适用场景&#xff0c;为企业选择合适的大模型业务架构提供指导&#xff0c;助力企业高效应…

Spring容器启动的过程(main)

大体流程如下 1、初始化 首先&#xff0c;Spring会通过用户提供的配置信息&#xff08;例如XML文件或者注解&#xff09;来初始化一个BeanFactory&#xff0c;这个BeanFactory是Spring容器的核心&#xff0c;它负责创建和管理所有的Bean。 2、读取配置生成并注册BeanDefini…

开源一套金融大模型插件(ChatGPT)

shares vscode 插件A 股量化交易系统自研金融大模型&#xff0c;复利Chat 源码地址&#xff1a; https://github.com/xxjwxc/shares

面试题:Rabbitmq怎么保证消息的可靠性?

1.消费端消息可靠性保证&#xff1a; 消息确认&#xff08;Acknowledgements&#xff09;&#xff1a;(自动(默认),手动) 消费者在接收到消息后&#xff0c;默认情况下RabbitMQ会自动确认消息&#xff08;autoAcktrue&#xff09;。为保证消息可靠性&#xff0c;可以设置auto…

CentOS 7设置静态IP地址的详细指南

CentOS 7设置静态IP地址的详细指南 配置静态IP地址是服务器或虚拟机管理的重要步骤之一&#xff0c;特别是在需要稳定、可预测的网络环境时。本文将详细介绍如何在CentOS 7上设置静态IP地址&#xff0c;帮助确保你的系统网络配置符合需求。 1. 查看当前网络配置 在进行任何更…

文件长度超出芯片容量, 超出部份将被忽略!ch341a编程器报错解决方法

出现这个错误提示&#xff0c;说明你正在刷的是华硕主板的cap格式BIOS文件。 编程器不支持这种文件&#xff0c;需要转换成编程器专用版本BIOS文件。 华硕cap格式BIOS转编程器bios文件&#xff0c;转换工具下载地址&#xff1a;https://download.csdn.net/download/baiseled/88…

再见Figma!!新的设计,代码协作神器!【送源码】

软件介绍 Penpot 是一款专门用来帮助设计师和开发者更好地合作的软件。它可以让设计师轻松地做出漂亮的设计稿&#xff0c;还能让这些设计稿变成真正的网站或者应用的一部分。这样&#xff0c;设计师和开发者之间就不会因为沟通不畅而产生麻烦了。 Penpot 专为设计师与开发者之…

在docker中进行日志切割

先在Linux中安装docker&#xff0c;然后在docker中安装appnode面板&#xff0c;并进行docker网络端口映射。接着进入docker&#xff0c;进行nginx日志切割。 安装docker 第一步&#xff0c;卸载旧版本docker。 若系统中已安装旧版本docker&#xff0c;则需要卸载旧版本docke…

书生大模型实战营-基础关-XTuner 微调个人小助手认知

XTuner 微调个人小助手认知 环境配置模型效果预览微调数据准备微调配置微调训练权重格式转换模型合并页面对话 环境配置 # 创建虚拟环境 conda create -n xtuner0812 python3.10 -y# 激活虚拟环境&#xff08;注意&#xff1a;后续的所有操作都需要在这个虚拟环境中进行&#…

Docker搭建Minio容器

Docker搭建Minio容器 前言 在上一集我们介绍了分布式文件存储行业解决方案以及技术选型。最终我们决定选用Minio作为分布式文件存储。 那么这集我们就在Docker上搭建Minio容器即可。 Docker搭建Minio容器步骤 创建Minio文件目录 我们选择创建/minio/data目录 修改目录权…

40.x86游戏实战-找出XXX遍历周围的类型

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【C#】中IndexOf的用法

在 C# 中&#xff0c;IndexOf 方法是字符串和列表&#xff08;如 List<T>&#xff09;等数据结构中常用的方法&#xff0c;用于查找指定元素或子串首次出现的位置。以下是针对不同情况使用 IndexOf 的示例。 对于字符串 对于字符串类型&#xff0c;IndexOf 方法返回子字…

scanpy切换显示颜色总结

函数实现 import scanpy as sc adata sc.datasets.pbmc68k_reduced() print(adata) sc.pl.umap(adata,color["bulk_labels"])def change_show_color(adata,label,category_listNone,color_listNone):for i in range(len(color_list)):if(len(color_list[i])7):colo…