C语言中的自定义类型

C语言中的自定义类型

(一)结构体

  1. 结构体的声明
    结构体是一些值的集合,这些值称为成员变量,结构体的成员可以是不同类型的变量;
  2. 结构体的声明
struct  tag
{
member-list;
}variable-list;
  1. 特殊声明
    在声明结构体的时候可以不完全的声明,称为匿名结构体,例如:
struct  
{char a;int  b;float c;}x;
  1. 结构体的自引用
    结构体的自引用使用指针
    示例代码如下:
struct Node
{
int data;
struct Node* next;
};
  1. 结构体变量的定义和初始化
struct Point 
{int x;int y;
}p1;
struct Point p2;
struct Point p3={x,y};
struct Stu
{char name[15];int age;};struct Stu s={"zhangsan",20};struct Node
{
int data;
struct Point p;
struct Node* next; 
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
  1. 结构体内存对齐
    结构体内存对齐的规则:
    第一个成员在与结构体变量偏移量为0的地址处。
    其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    比特科技
    对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
    如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
    所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
    为什么存在内存对齐?
    什么存在内存对齐?
    大部分的参考资料都是如是说的:
    平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址
    处取某些特定类型的数据,否则抛出硬件异常。
    性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理
    器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
    总体来说:
    结构体的内存对齐是拿空间来换取时间的做法。
    修改默认对齐参数:
    #pragma pack(n)
    n为2^n;

(二)位段

什么是位段
位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是int、unsigned int或 signed int
2.位段的成员名后边有一个冒号和一个数字;
例如:

struct A
{int _a:2;int _b:5;};

位段的内存分配:
位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
3.位段的跨平台问题:
int位段被当成有符号数还是无符号数是不确定的。
位段中最大位的数目不能确定。
位段中的成员在内存中从左往右还是从右往左分配标准尚未定义。
当一个结构体包含两个位段,第一个位段成员比较大,无法容纳于第一个位段时,是舍弃剩余位置还是利用,这是不确定的。

(二)枚举

  1. 枚举
    枚举顾名思义就是一一列举。
    把可能的取值一一列举。
  2. 枚举类型的定义
enum Day
{
mon,
thes,
wed,
thur,
fri,
sat,
sun
}

上定义的 enum Day , 是枚举类型。 {}中的内容是枚举类型的可能取值,也叫 枚举常量
这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。
3. 枚举的优点:
增加代码的可读性和可维护性
和#define定义的标识符比较枚举有类型检查,更加严谨。
防止了命名污染(封装)
便于调试
使用方便,一次可以定义多个常量。

(三)联合

  1. 联合类型的定义
    联合也是一种特殊的自定义类型 这种类型联合也叫共用体)。 比如:联合类型的定义联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(联合也叫共用体)。 比如:
//联合类型的声明
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un))
  1. 联合的特点
    联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)
  2. 联合大小的计算
    当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大比如:联合大小的计算联合的大小至少是最大成员的大小。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

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

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

相关文章

2019版中国数字经济发展与就业白皮书

未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云…

文件即子文件删除

先简单说明一些基本:(下面所说的文件夹也就是目录,我个人一开始不知道目录是什么,后来才知道目录就是文件夹)。 1.首先介绍delete()方法的基本用法。 先创建一个File对象 ,例如: File file new…

深入卷积神经网络背后的数学原理

来源:AI科技大本营摘要:在计算机神经视觉技术的发展过程中,卷积神经网络成为了其中的重要组成部分,本文对卷积神经网络的数学原理进行了介绍。文章包括四个主要内容:卷积、卷积层、池化层以及卷积神经网络中的反向传播…

Linux学习之如何在物理机上安装Linux发行版

Linux学习之如何在物理机上安装Linux发行版 第一步:制作系统安装盘 准备一个至少8GB的空白U盘。下载启动盘制作工具Rufus,下载链接:https://pan.baidu.com/s/1CU8oZJVyCgdwETI2VxJwxA 提取码:gwi1下载Linux发行版安装镜像&#…

jQuery Easy UI Accordion(可伸缩的面板)包

Accordion 可伸缩的面板组件。基于panel,示为以下的比率&#xff1a; <!doctype html> <html lang"en"><head><meta charset"UTF-8"><script type"text/javascript" src"easyui/jquery.min.js"></sc…

Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置

Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置 第一步&#xff1a;在PC机安装Ubuntu18.04LTS 具体安装步骤参见上一篇文章 第二步&#xff1a;安装arm-linux-gcc交叉编译环境 在终端中执行sudo mkdir /forlinx,新建名为forlinx的文件夹&#xff08;文件夹名可任意&…

报告解读 | 智能技术“核聚变”催生智能经济,将拉动十万亿市场

来源&#xff1a;阿里研究院从IT时代、互联网到智能2019年政府工作报告&#xff0c;正式提出了“智能”战略&#xff1a;“深化大数据、人工智能等研发应用。打造工业互联网平台&#xff0c;拓展‘智能’&#xff0c;为制造业转型升级赋能。”以5G、物联网、人工智能等技术为代…

Linux学习之云服务器搭建嵌入式Linux开发环境

Linux学习之云服务器搭建嵌入式Linux开发环境 第一步&#xff1a;购买云服务器 进入腾讯云官方网站腾讯云官方网站 选择云校园云校园 进入控制台 将云服务器系统设置为Ubuntu系统 使用Xshell6登录云服务器 使用Xftp6进行文件的上传与下载 在云服务器安装arm-linux-gcc…

JS中toFixed()方法的问题及解决方案

最近发现JS当中toFixed()方法存在一些问题&#xff0c;采用原生的Number对象的原型对象上的toFixed()方法时&#xff0c;规则并不是所谓的“四舍五入”或者是“四舍六入五成双”&#xff0c;所谓“四舍六入五成双”&#xff0c;在百度百科上给的解释是&#xff1a;也即“4舍6入…

Linux学习之Linux历史

Linux学习之Linux历史 一、UNIX发展史 1968年&#xff0c;一些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。1969&#xff0d;1970年&#xff0c;AT&T的贝尔实验室…

AI的阿基里斯之踵:模糊性

来源&#xff1a;IEEE电气电子工程师学会摘要&#xff1a;网罗全球科技前沿动态&#xff0c;为科研创业打开脑洞。很多年前&#xff0c;我和一位朋友去参观一个果园。他的儿子是这个果园的经理&#xff0c;向我们介绍了其工作。我的这位朋友和我都是工程师&#xff0c;开始讨论…

Linux学习之嵌入式Linux编程文件IO(C语言版)

Linux学习之嵌入式Linux编程文件IO&#xff08;C语言版&#xff09; 一、文件IO常用函数 1.open 2.write 3.read 示例代码&#xff1a; #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <stdli…

3个技巧让你正能量满满

因为工作关系&#xff0c;今年我每个月都在公司的新人入职培训课上讲一遍《职业习惯》&#xff0c;其中会讲到“职业生涯成功的关键点”&#xff0c;讲到“保持积极的心态”&#xff0c;每次都会讲几个真实的案例。这几个案例回味起来&#xff0c;对管理负面情绪、保持积极心态…

哈勃望远镜进一步确认宇宙在加速膨胀

来源&#xff1a;新华社美国哈勃太空望远镜的新观测成果进一步确认了宇宙在加速膨胀&#xff0c;现在的膨胀速度比根据早期宇宙特征预测的膨胀速度快大约9%。此次研究成果25日发表在美国《天体物理学杂志》上。研究人员利用新方法对大麦哲伦星云的70颗造父变星进行了观测。有“…

Git的安装和配置

Git的安装和配置 一、下载并安装git git下载地址 所有均选择默认值&#xff0c;一路NEXT 二、下载并安装tortoisegit 所有均选择默认值&#xff0c;一路NEXT 三、新建GitHub存储库 1.打开github官方网站&#xff0c;注册账号 2.登录后点击绿色NEW按钮 3.进入如图所示&am…

ARGB和PARGB

原文链接: http://blog.csdn.net/lnwaycool/article/details/8610313 ARGB和PARGB是针对32位图像而言的&#xff0c;Windows下图像可以是1位、4位、8位、16位、24位以及32位的。32位图像的一个像素 在内存中占四个字节&#xff0c;其排列顺序依次是Alpah,Red,Green,Blue,其中的…

AI芯片重磅破局者,开启边缘新智元

来源&#xff1a;物联网智库摘要&#xff1a;曾几何时&#xff0c;我们惊讶于AI算力和智力的创新程度&#xff0c;但彼时AI所创造的产业价值并不明显。随着移动互联网时代走向物联网时代&#xff0c;越来越多的场景和终端需要对数据进行即时高效的处理&#xff08;如车联网、无…

静态连接和动态链接有什么区别?

静态连接要将所以的外部调用函数都连接到一个目标文件中&#xff0c;动态链接不需要将应用程序所需的外部函数代码从库中取出来并连接到目标文件中。转载于:https://www.cnblogs.com/luo841997665/p/4662505.html