我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c语言中如何自定义结构体、位段和枚举

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c语言中如何自定义结构体、位段和枚举

这篇文章主要介绍了c语言中如何自定义结构体、位段和枚举的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c语言中如何自定义结构体、位段和枚举文章都会有所收获,下面我们一起来看看吧。

结构体类型创建:
struct Stu
{    char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}stu1,stu2;
结构体的自引用:
struct Node
{    int data;
struct Node* next;
};//用到指针

结构体的初始化:(可以整体初始化,但不可以整体赋值)
struct Stu        //类型声明
{    char name[15];//名字
int age;      //年龄
};
struct Stu s = {"zhangsan", 20};//初始化

(重点)结构体的内存对齐:
首先得掌握结构体的对齐规则: 1. 第一个成员在与结构体变量偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

  1. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。 4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是 所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
    为什么要内存对齐:

    1. 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址 处取某些特定类型的数据,否则抛出硬件异常

  2. 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理 器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
    (用空间换取时间的做法)
    结构体传参:
    函数传参的时候,参数是需要压栈,会有时间和空间上的系统开销。
    如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
    结论: 结构体传参的时候,要传结构体的地址。
    位段:(可以调整结构体大小)
    1.位段的成员必须是 int、unsigned int 或signed int 或者char。
    2.位段的成员名后边有一个冒号和和一个数字。
    struct A
    {    int _a:2;  //数字表示占的bit位数
    int _b:5;  
    int _c:10;  
    int _d:30;
    };
    位段的内存分配

    1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于×××家族)类型 2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。 3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
      位段大小:
      . 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的 位还是利用,这是不确定的。(如果后面空间足够直接后补,如果不够,另外寻找一片足够的空间)(返回的是新地址的首地址)
      枚举:
      enum Day//星期
      {    Mon,
      Tues,  
      Wed,  
      Thur,  
      Fri,  
      Sat,  
      Sun
      };

这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。 只能枚举常量赋给枚举变量。可以直接复制。值间断递增。
枚举大小:
加在一起
联合:

联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以 联合也叫共用体)。
union Un2
{    short c[7];
int i;
};
联合大小:
联合的大小至少是最大成员的大小。 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

关于“c语言中如何自定义结构体、位段和枚举”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“c语言中如何自定义结构体、位段和枚举”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c语言中如何自定义结构体、位段和枚举

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c语言中如何自定义结构体、位段和枚举

这篇文章主要介绍了c语言中如何自定义结构体、位段和枚举的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇c语言中如何自定义结构体、位段和枚举文章都会有所收获,下面我们一起来看看吧。结构体类型创建:struct St
2023-06-17

怎么在C语言中自定义结构体和枚举

这篇文章将为大家详细讲解有关怎么在C语言中自定义结构体和枚举,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使
2023-06-14

C语言结构体,枚举,联合体如何使用

本篇内容介绍了“C语言结构体,枚举,联合体如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、匿名结构体struct{ char
2023-07-02

C语言中如何定义结构体

本篇内容主要讲解“C语言中如何定义结构体”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中如何定义结构体”吧!什么是结构体?在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚
2023-06-16

c语言如何自定义结构体类型

在C语言中,可以使用`typedef`关键字来自定义结构体类型。`typedef`关键字用于为已存在的类型定义一个新的名称。以下是定义结构体类型的语法:```ctypedef struct {// 结构体成员data_type member
2023-09-04

c语言如何定义结构体

在 c 语言中定义结构体:使用 struct 关键字声明结构体类型。在花括号中定义字段。使用 sizeof(struct 结构体名称) 分配内存。用点运算符 (.) 访问结构体字段。如何在 C 语言中定义结构体结构体是一种复合数据类型,它
c语言如何定义结构体
2024-05-22

C语言中如何在结构体内定义函数

这篇文章主要介绍了C语言中如何在结构体内定义函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-24

如何进行C语言结构体的定义和使用

本篇文章为大家展示了如何进行C语言结构体的定义和使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.1: 结构体用来干嘛?生活中我们会遇到很多的表格,就比如你的学习成绩表,有姓名 ,学号,各科的成
2023-06-22

go语言中结构体方法如何定义

本篇内容主要讲解“go语言中结构体方法如何定义”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中结构体方法如何定义”吧!go语言中结构体方法的定义方法:1、定义一个结构体,语法“type
2023-07-05

C语言中结构体和共用体如何使用

本篇文章给大家分享的是有关C语言中结构体和共用体如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。结构体 / struct结构体的定义声明一个结构体类型的一般形式为:str
2023-06-16

C语言中使用qsort函数对自定义结构体数组进行排序

这篇文章主要介绍了C语言中使用qsort函数对自定义结构体数组进行排序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-16

如何在C语言中使用多维数组和结构体

如何在C语言中使用多维数组和结构体?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1887 颜色精简题目:有一个颜色集合,里面有若干个颜色值(RBG系统表示)。现
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录