C语言之——自定义数据类型

2023-11-20

目录

前言:什么是自定义数据类型 ? 

一,自定义数据类型之:数据类型命名

1,深入应用typedef:

二,自定义数据类型之:结构体类型命名

1,深入理解struct结构体:

三,自定义数据类型之:联合体类型命名

1,union与struct的区别:

2,union类型应用:

四,自定义数据类型之:枚举类型命名


前言:什么是自定义数据类型 ? 

所谓自定义数据类型,就是用一个新名字重新对一个数据类型命名,后面新名字就有了该数据类型的功能,在调用该新名字时,就相当于调用该数据类型。

自定义数据类型包含不同的使用方法,每一个方法都有自己的关键字。


一,自定义数据类型之:数据类型命名

现在C语言中常见的数据类型有:

       整型:int, short, long, long long

       浮点型:float, double

       字符型:char

但是如何定义一个字节类型呢?

byte(字节类型)1字=1字节=8位=8比特。计算机二进制中一个0或者1就代表1位。

类型数据命名关键字:typedef(意思为type define)

语法:typedef    Type    NewTypeName ;

                       已有类型             新名字

使用该关键字可以对C语言中数据类型进行新命名。

值得注意的是typedef并没有创建新类型,只是创建了类型别名。

typedef unsigned char byte;

这个语句就是把unsigned char重新命一个名字type,两者类型和功能一模一样。

typedef经常用于简化类型名。

1,深入应用typedef:

typedef对数组类型和函数类型的应用;

每一个函数/数组类型都有自己对应的指针类型,

例如int(int);对应int(*p)(int);

       float[4];对应float(*q)[4];

现在可以使用typedef关键字统一函数/数组指针类型为type* h; 格式。

typedef float(Farr4)[4];
       /* Farr4代表float[4]类型的数组 */
typedef int(IFunc)(int,int);
       /* IFunc代表int(int,int)类型的函数 */
​
float gar[4] = {1, 2, 3, 4};
int add(int a, int b)
{
    return a + b;
}
​
Farr* pa = &gar;
IFunc* pb = add;     

以上代码,Farr* q 指针可以指向所有float[4]类型的数组;

                 IFunc* p指针可以指向所有int(int, int)类型的函数;

另一个注意的点:在函数内部起新名字无影响。

二,自定义数据类型之:结构体类型命名

结构体关键字:struct

作用:创建不同数据类型的一个集合。它的本质是变量的集合。

语法:

struct  TypeName

{

        Type1 var1;

        Type2 var2;

        ....

        TypeN varN;

};  

定义好一个Struct结构体之后,就可以使用了:

#include <stdio.h>
struct  student
{
        char name[20];
        int id;
        short major;
};  
int main()
{
    struct student s1 = {"qingshan", 7, 98};
    struct student* ps = &s1;
    printf("s1.name = %s\n",s1.name);
    printf("s1.major = %d\n",ps->major);
    
    return 0;
}

1,两个操作符:

. 操作符用于取值:s1.name(取值为qingshan)

->操作符用于指针的取值:ps->major(取值为98)

1,深入理解struct结构体:

1,struct结构体变量中的成员占用独立的内存。

当前的地址要为每个变量所占字节的整数倍,如果不是,变量起始地址就会往后移,找到一个是整数倍的地址,然后该地址就会作为变量的其实地址。

2,位域。

在现代的程序设计中,我们是用字节作为最小的单位使用内存。

但特殊场合,可以使用struct结构体将比特位作为最小的单位使用内存。

因为结构体类型能够指定成员变量占用内存的比特位宽度(位域)。

位域示例:

struct BW
{
    unsigned char a : 4;  //a占用一个字节的4位宽度。
    unsigned char b : 3;  //a占用一个字节的3位宽度。
    unsigned char c : 1;  //a占用一个字节的1位宽度。
};

示例中sizeof(struct BW) = 1;

  • 使用位域时,位域成员必须为整型,默认情况下成员依次排列。

  • 位域成员占用位域数不能超过类型宽度(错误示例   char d : 9;)

  • 存储位不足时自动启用新存储单元。

  • 可以舍弃当前未使用的位,重新启动存储单元。

struct BW
{
    unsigned char a : 4;  
    unsigned char   : 0;  //申请语句,表示重新开始启用新字节。
    unsigned char c : 4;  
};

3,struct结构体可以用typedef赋予新名字。

#include<stdio.h>
typedef struct student  Stu;   //student新名字为Stu.
struct student               
{
    char name[20];
    int id;
    short major;
};
int main()
{
   Stu s = {{0}};      //赋值。
   return 0;
}

第11行:后面没有被赋值的初始值,默认初始值为0;

4,struct结构体可以省略类型名,称之为无名结构体类型。

     但省略类型名后,每次创建变量都必须给出完整的结构体定义。

     无名结构体类型总是互不相同的类型。

int main()
{
    struct {int a, int b;} v1;  //无名结构体类型。
    struct {int a, int b;} v2; 
    struct {int a, int b;}* pv; 
    v1.a = 1;
    v1.b = 2;
    
    v2 = v1;   //error.
    pv = &v1;  //error.
    return 0;  
}

     在这里,v1和v2是不同类型。


三,自定义数据类型之:联合体类型命名

联合体关键字:union

作用:创建不同数据类型的一个集合。它的本质是变量的集合。

用法:union是struct的兄弟,用法十分相似。

语法:

union  TypeName

{

        Type1 var1;

        Type2 var2;

        ....

        TypeN varN;

};  

1,union与struct的区别:

  • union类型所有成员共享同一段内存(所有成员的起始地址相同)

  • union类型的大小取决于它所包含的成员最大的那一个。

  • union类型的变量只能对第一个成员变量初始化,后面变量的值就等于第一个变量的值。

2,union类型应用:

可以用来判断系统大小端。

  • 小端系统:低位数据存储在低地址内存中。

  • 大端系统:低位数据存储在高地址内存中。


四,自定义数据类型之:枚举类型命名

枚举类型关键字:enum

作用:创建不同数据类型的一个集合。它的本质是变量的集合。

用法:能够定义整型常量的集合类型。

语法:

enum TypeName

{

        IntConst1,     (逗号可以不写)

        IntConst2,     (IntConst为整型常量)

        ....

        IntConstN

};  

注意事项:

  1. 第一个枚举常量默认值为0;

  2. 后续常量的值在前一个常量值的基础上加1;

  3. 可以任意对枚举常量指定整型值(只能指定整型值)

enum Day{MON = 1,TUE, WED, THU, FRI, SAT, SUN};
enum Season{Spring, Summer = 2, Autumn, Winter = -1};

输出值:MON = 1,TUE = 2, WED = 3, THU = 4, FRI = 5, SAT = 6, SUN = 7

      Spring = 0, Summer = 2, Autumn = 3, Winter = -1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言之——自定义数据类型 的相关文章

  • GVIM教程,GVIM使用心得

    目录 一 gvim的基础操作 1 插入字符 2 移动光标或页面 3 查找内容 4 替换 5 删除文本 6 复制粘贴 7 对文件的操作 8 多行编辑 9 选中文本 一 gvim的基础操作 以下操作均在命令模式下进行 操作中需要输入冒号则进入末
  • Java Quartz框架

    Java Quartz框架 Java Quartz是一个开源的作业调度框架 用于在Java应用程序中实现定时任务和调度功能 它提供了灵活的任务调度和执行机制 可以根据时间表或触发事件来触发任务的执行 Quartz的主要作用是简化定时任务的管
  • elasticsearch query bool nested对象 聚合

    复杂的查询 下面的查询是小编自己研究写的一个比较复杂 的语句 涉及到查query bool must 已经过滤条件term 关键词介绍 from 表示从第几条开始返回 size 表示返回的题目数大小 query 查询语句 bool must

随机推荐

  • 抢「.AI」域名,成了 3000 万美元的大生意

    作者 汤一涛编辑 靖宇 1848 年 一个木匠在加利福尼亚州科罗马地区的一条河中偶然发现了金箔 尽管他曾试图保守这个秘密 但是金子不会说谎 一场席卷全美的淘金热就此开始 许多人怀揣着一夜暴富的梦想涌入加利福尼亚 1847 到 1870 年间
  • tensorflow-GPU版本安装,RTX3060

    首先需要安装好pycharm和anaconda 开始安装tensorflow GPU版 一 查看版本 1 首先检查自己电脑的cudn版本 开始 gt 设置 gt 应用 gt 安装的应用 搜cuda 我的是cuda 11 6 2 查看显卡型号
  • qt线程

    qt4 7 之前的线程操作 代码 需要重写一个类 继承QTread class mythread public QThread Q OBJECT 必须加 否则出现一些奇怪问题 public mytherad protected void r
  • 自动化办公-3.python自动化之word操作

    一 课前准备 python 处理 Word 需要用到 python docx 库 终端执行如下安装命令 pip3 install python docx 备注 可能word用的少 这块并没认真 但是后面的邀请函这块可以作为有用参考 没准会用
  • 什么是SSL协议?

    转自 微点阅读 https www weidianyuedu com 什么是SSL协议 SSL协议是一种安全传输协议 SSL是SecureSocketLayer的缩写 即安全套接层协议 该协议最初由Netscape企业发展而来 目前已经成为
  • 在本地部署自己的漏洞文章武器库(详细步骤说明)

    在本地部署自己的漏洞文章武器库 在平时我们进行web渗透的过程中 有些poc CVE详细情况需要进行查询之后才能进行利用 对于初级渗透人员来说 对漏洞情况和利用方式掌握不足的情况下 打造属于自己的漏洞武器库就至关重要了 可以提高平时工作和h
  • 调试osgEarth(十五)分页瓦片加载器在更新遍历时对请求处理过程(1)

    感谢 hankern 学习链接https blog csdn net hankern article details 84195754 继续调试 我感觉有两点 1 处理能处理的请求 2 摒弃处理过的请求和超时的请求 从上图可以看到 每帧可以
  • Mybatis进阶--批量新增数据

    一 传统JDBC进行批处理操作 package jdbc import java io InputStream import java sql import java util Properties public class jdbcUti
  • maven更换阿里云镜像

    1 setting文件增加maven节点
  • numpy索引与切片

    一 整数索引 作用 要获取数组的单个元素 指定元素的索引即可 例子 x np array 1 2 3 4 5 6 7 8 print x 2 3 x np array 11 12 13 14 15 16 17 18 19 20 21 22
  • listview item设置点击跳转_Flutter之路由及页面跳转与返回

    1 路由跳转到页面思路 设计三个按钮 然后三个点击事件 利用Navigator of context push MaterialPageRoute builder context gt page 进行跳转新页面2 页面折回到路由在跳转的页面
  • 小程序v-for与key值使用

    小程序中的v for和key与Vue中的用法基本相同 v for用于循环渲染列表 key用于给每个循环项分配一个唯一的标识 使用v for时 通常建议使用wx for代替 例如
  • SQL Server 中给字段设置默认值的方式

    1 在创建表的时候创建默认值 if object id T U is not null drop table T GO create table T ID int Name varchar 20 LoginTime datetime def
  • RecyclerView应用 —— 好友列表实现

    实现的效果类似于QQ好友列表 点击可展开 再次点击收起 两个Item的布局都很简单 这里就不给布局代码了 值得一提的是 RecyclerView本身并没有ListView那样的点击效果 想要类似效果可以为Item的根布局写个Selector
  • JS混淆加密的代码如何解密

    科普简介 混淆是指将 JavaScript 代码变得难以理解的过程 这可以通过更改变量名 函数名和类名 以及将代码压缩到一行来实现 混淆的主要目的是使代码难以被盗用 并保护代码的知识产权 功能作用与常用的解决方案 混淆后的代码很难阅读 但是
  • Maven进阶-配置仓库

    1 1maven介绍 Maven是一个项目管理和综合工具 Maven提供了开发人员构建一个完整的生命周期框架 开发团队可以自动完成项目的基础工具建设 Maven使用标准的目录结构和默认构建生命周期 主要服务于基于Java平台的项目构建 依赖
  • Linux系统如何看目录属于哪个磁盘分区

    Linux是先有目录 再有磁盘分区 df h 目录 例如 没有挂载磁盘的目录 显示在系统盘 root iZ2ze57v3n0zma46zqiq8nZ sh 1 5 5 df h alidata Filesystem Size Used Av
  • Unity使用spine动画

    Unity使用spine动画 在 Unity 中 常常使用 Spine 来制作一些动画 引擎本身并不能直接播放 Spine 动画 需要额外导入一个 RunTime 插件库才能支持 官网插件导入 当然 也可以到 Spine 官网关于 Unit
  • 机器学习原理(1)集成学习基本方法

    一 什么是集成学习 集成学习 ensemble learning 通过将多个学习器进行组合来完成学习任务 下图显示集成学习的一般结构 取自周志华老师的西瓜书 个体学习器通常由一种现有的学习算法从训练数据产生 例如决策树 C4 5 CART
  • C语言之——自定义数据类型

    目录 前言 什么是自定义数据类型 一 自定义数据类型之 数据类型命名 1 深入应用typedef 二 自定义数据类型之 结构体类型命名 1 深入理解struct结构体 三 自定义数据类型之 联合体类型命名 1 union与struct的区别