首页 > 其他分享 >自定义类型:结构体,枚举,联合

自定义类型:结构体,枚举,联合

时间:2024-06-20 20:01:12浏览次数:13  
标签:stu1 20 struct 自定义 int char 枚举 类型 结构

目录

一. 结构体

1.0 C语言中为什么要引入结构体?

1.1 结构体的声明

1.2 特殊的声明

1.3 结构体变量的定义和初始化

二. 枚举

1.0 类型的定义

 1.1 我们可以使用#define定义常量,为什么非要使用枚举?

三. 联合(共用体)

1.0 联合类型的定义

1.1 联合的声明


一. 结构体

1.0 C语言中为什么要引入结构体?

一组数据中往往具有不同的类型,而普通的基本类型无法满足实际要求 如:一本书(书名,作者,生产日期,售价),学生(年龄,学号,成绩,联系方式)等,因此为了表示这些复杂的事物,这时就引入了结构体

结构(体)是一些值得集合,这些值称为成员变量。结构得每个成员可以是不同类型的变量

1.1 结构体的声明
struct tag          //结构体类型名称
{

    member-list;    //成员列表
  
}variable-list;     //变量列表

例:

描述一个学生的属性

struct stu1         
{
    char name[20]; //姓名
    int age;       //年龄
    char sex[5];   //性别
}; //注意这里最后的分号一定要有

我们可以对这种自定义结构体进行简化:

->1.声明结构体的时候直接用typedef替换

typedef struct stu1 
{
    char name[20];
    int age;
    char sex[5];
}stu1;

stu1 s1;  //用typedef替换之后就可以直接用stu1 s1直接创建变量了

->2.声明之后再使用typedef替换

struct stu1 
{
    char name[20];
    int age;
};

typedef struct stu1 stu1;
1.2 特殊的声明

匿名结构体变量,又叫不完全声明,创建时同时声明变量只能使用一次,再去main函数中声明另一个变量就不行了

struct    //没有结构体名称
{
    char name[20];
    int age;
}s1;

以上两种都可以

注意:

->1.如果在声明匿名结构体时没有声明结构体变量,后续是不能使用的

->2.

#include <stdio.h>
struct 
{
    int a;
    char b;
    float c;
}x;

struct 
{
    int a;
    char b;
    float c;
}a[20], *p;

void main()
{
    p = &x;
}

      

由上图可知:在编译器看来这两个是不同的匿名结构体只能使用一次,系统认定p和x是两个不同的变量,所以会报警告说两边类型不兼容。p = &x是可以使用的,但是p = &x是非法的,不建议去这么使用

举个例子理解一下:别人掉了钱你捡到了,你可以使用,但是不合法

1.3 结构体变量的定义和初始化

如何定义和初始化呢?

->1.声明结构体的同时定义结构体变量s1

struct stu1         
{
    char name[20]; //姓名
    int age;       //年龄
    char sex[5];   //性别
}s1;               


->2.声明结构体的同时定义结构体变量s1以及初始化

struct stu1         
{
    char name[20]; //姓名
    int age;       //年龄
    char sex[5];   //性别
}s1 = {"zyx", 20, "男"};    

->3.定义结构体变量

struct stu1 s2;

->4.定义变量的同时初始化struct stu2

struct stu1 s3 = {"zyx", 20, "男"};

->5. 结构体嵌套结构体

struct stu2
{
    int age;
    struct stu1 s4; 
}p1 = {20, {"zyx", 20, "男"},};

struct stu2 p2 = {20, {"zyx", 20, "男"},};

它们都是在函数之外的声明,所以s1,s2... 是全局变量,在我们编程过程中少使用全局变量,如果代码量大的话不利于后期维护  ,所以还是尽量使用局部变量在函数中定义和声明结构体变量

二. 枚举

枚举顾名思义就是一一列举,把可能的取值一一列举出来例:一周的星期一...日,月份,男女性别

1.0 类型的定义
enum color
{
    RED,
    GREEN,
    BLUE
};

(1). 若定义的时没有初始化则默认从0,1,2 ...按顺序赋值

如图所示:

(2). 如果给enum中任意一个成员赋值,则后面的成员都会往下按顺序增1

如图所示:

注意:

#include <stdio.h>

enum color
{
    RED,
    GREEN = 6,
    BLUE
};

int main()
{
    enum color c1 = 0;
    printf("%d", c1);
    return 0;
}

enum color c1 = 0; 虽然可以使用但是不建议这样写,左右类型不匹配,c1是枚举类型而0是整型

 1.1 我们可以使用#define定义常量,为什么非要使用枚举?

优点:

->1. 增加代码的可读性和可维护性 例:用枚举可以优化通讯录(通讯录系统)将case后的数换成枚举成员更容易让人理解

->2. 和#define定义的标识符比较枚举有类型检查,更加严谨

->3. 防止命令污染,进行了封装,将类型写在大括号中(统一类型)

->4. 便于调试(#define在预处理阶段就消失了)

->5. 使用方便,一次可以定义多个常量

三. 联合(共用体)

1.0 联合类型的定义

特殊的自定义类型,这种类型定义的变量也包含一系列的成员

特征:这些成员共用同一块空间(所以联合也叫共用体)

1.1 联合的声明
union UN
{
    char c;
    int i;
}un;

大小至少4个字节,因为至少要将i给装起来

int main()
{
    printf("%p\n", &un);
    printf("%p\n", &un.c);
    printf("%p\n", &un.i);
}

可以看到共用体中的成员地址都是一样的,这也证明了它们共用空间

两个成员不可同时使用

从这两张图中可以看到当un.i后赋值时共用体union UN中装的就是1,un.c后赋值时union UN中装的就是字符a

例:

判断大小端(使用联合体判断)

int check_sys()
{
    union UN
    {
     char c;
     int i;
    }un;
    un.i = 1;
    return un.c;
}
int main()
{
    int ret = cheak_sys();
    if(ret == 1)
    {
       printf("小端");
    }
    else
    {
       printf("大端");    
    }
}

标签:stu1,20,struct,自定义,int,char,枚举,类型,结构
From: https://blog.csdn.net/m0_73634434/article/details/139774819

相关文章

  • 【C语言】自定义类型
    目录一、结构体:1、结构体的声明:2、结构体的自引用:3、结构体变量的定义和初始化:4、结构体内存对齐:5、结构体传参:6、位段:二、枚举类型:三、联合体:一、结构体:1、结构体的声明:首先要了解什么是结构:结构是一些值的集合,与数组不同的是结构的每一个成员变量可以使不同......
  • [机器视觉]halcon应用实例 用户自定义多ROI模板匹配
    本示在前面几个halconROI示例的基础上继续扩展,更靠进实标情况。为了使ROI匹配更灵活,就要求可以让用户或工程根据实际使用情况自己去画ROI,想画几个是几个。数量不能在代码里写死。这次升级的主要是增加了一个while循环根据用户的鼠标按键来进行判断是否继续画,还是退出画ROI。效......
  • 数据处理技术-Hive的表与数据类型
    Hive数据模型Hive的数据模型主要由表构成,包括内部表,外部表,分区表和桶表。我也将从这四个方面介绍。在这之前先介绍另外一个概念:DDL,DataDefinitionLanguage数据定义语言,是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言。核心语法由CREATE,ALTER,DROP......
  • k8s探针类型及探针配置
    探针类型:存活探针(LivenessProbe):用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet杀掉该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,则kubelet认为该容器的LivenessProbe探针返回的值永远是“Success”。......
  • 单细胞测序最好的教程:(六)细胞类型注释|或许是全网最详细的注释教程
    作者按本教程将是本系列教程中最重要的一章,我们后续所有的单细胞分析,都要基于准确的细胞类型注释。本系列教程首发于“[单细胞最好的中文教程](single_cell_tutorialReadthedocs)”,未经授权许可,禁止转载。全文字数|预计阅读时间:4500|5min——Starlitnightly1.背景我们......
  • 单细胞测序最好的教程(九): 细胞类型自动注释|发表在Science的注释算法
    作者按本章节主要讲解了基于大模型的自动注释方法,包括CellTypist(发表在Science)和MetaTiME(发表在Naturecommunication),一个通用,一个泛癌专用。本教程首发于单细胞最好的中文教程,未经授权许可,禁止转载。全文字数|预计阅读时间:3000|3min——Starlitnightly(星夜)1.背景我......
  • 单细胞测序最好的教程(八): 细胞类型自动注释-1|基于marker的自动注释
    作者按本章节主要讲解了基于marker的自动注释方法,一般来说,我会先自动注释,再手动去确认marker,这是因为,对于一个陌生的组织,我对marker是不了解的,自动注释可以帮助我快速熟悉细胞类型。本教程首发于单细胞最好的中文教程,未经授权许可,禁止转载。全文字数|预计阅读时间:5000|5min......
  • 单细胞测序最好的教程(十):细胞类型注释迁移|万能的Transformer
    作者按本章节主要讲解了基于transformer的迁移注释方法TOSICA,该算法在迁移注释上达到了SOTA的水平,在注释这么卷的赛道愣是杀出了一条血路。本教程首发于单细胞最好的中文教程,未经授权许可,禁止转载。全文字数|预计阅读时间:3000|3min——Starlitnightly(星夜)1.背景迁移注释......
  • 快速自定义表单开发受欢迎的几个优势
    为了满足业务需求,低代码技术平台带着更理想的优势特点,广泛用于各中大型企业中,是助力企业实现提质增效、提升开发效率的有力武器。那么,您知道快速自定义表单开发的优势体现在哪里吗?为了帮助大家了解这些详情,接下来将会为大家介绍低代码技术平台及快速自定义表单开发的优势,希望能给......
  • 0基础学C++ | 第02天 | 基础知识 | sizeof关键字 | 浮点型 | 字符型 | 转义字符 | 字
    前言  该文章是在B站学习C++,同时结合自己的理解整理的笔记,视频连接:https://www.bilibili.com/video/BV1et411b73Z/?p=8&spm_id_from=333.880.my_history.page.click 1、sizeof关键字作用:利用sizeof关键字可以统计数据类型所占用的内存大小语法:sizeof(数据类型/变量)#incl......