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

目录

一. 结构体

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("大端");    
    }
}

  • 37
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值