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

24、流化催化裂化的分子建模 本文探讨了流化催化裂化(FCC)的分子建模方法,重点分析了如何通过机理建模和模型修剪策略(如反应规则和随机规则)来减少计算复杂度,同时保持化学意义。文章还介绍了定量结构反应性关联(QSRC)在动力学参数确定中的应用,以及结焦对催化剂活性的影响。通过这些方法,FCC反应模型能够在预测产物分布的同时,显著提高计算效率。 阅读详情

前言

C语言的数据类型包括基本类型(内置类型)、构造类型(自定义类型)、指针类型和空类型(void),其中基本类型就是我们常见的整形、浮点型等,而自定义类型则包括数组、结构体、字段、枚举、联合(共用体),数组我们已经非常熟悉了,今天我们主要学习自定义类型中其他几种类型:结构体、字段、枚举以及联合。

一. 结构体

  • 结构体基础知识

C语言提供了两种聚合数据类型用来存储超过一个的单独数据:数组和结构,数组是相同类型元素的集合,每个元素通过下标访问或指针间接访问来选择。结构是不同类型数据的集合,这些数据称为它的成员,由于一个结构的成员可能长度不同,所以不能用下标访问它们,相反,每个结构成员都有它的名字,它们是通过名字访问的。

1. 结构体类型的声明

  • 一般声明

在声明结构时,必须列出它包含的全部成员的类型和名字

struct tag//标签
{
    member-list//成员列表
}varible-list;//变量列表(可省略)
struct human
{
    char name[10];
    int age;
    char sex[5];
};
  • 特殊声明

结构体声明的时候,省略结构体标签,这种结构体被称为匿名结构体

struct //匿名结构体
{
    int a;
    char b;
    float c;
}x;

由于匿名结构体没有名字,所以不能在程序的其他位置使用该结构体创建结构体变量,而只能在结构体声明的同时定义结构体变量,也就是说,匿名结构体只能使用一次。

以下是不正确使用

struct //匿名结构体
{
    int a;
    char b;
    float c;
};

struct x;//error

声明匿名结构时可以使用的另一种良好技巧是用typedef创建一种新的类型

typedef struct
{
	int a;
	char b;
    float c
}simple;

simple x;

这个技巧和声明一个结构体标签的效果几乎相同,区别在于simple现在是个类型名而不是个结构标签。

2. 结构的自引用

在一个结构体内部包含一个类型为该结构本身的成员是否合法呢?

struct s1
{
    int a;
    struct s1 b;
    int c;
};

这种类型的自应用是非法的,因为成员b是另一个完整的结构,其内部还将包含自己的成员b,这样重复下去永无止境,像是一个永远不会终止的递归程序。下面的声明才是合法的:

struct s1
{
    int a;
    struct s1* b;
    int c;
};

这个声明和前面那个声明的区别在于b现在是一个指针而不是结构,编译器在结构的长度确定之前就已经知道指针的长度,所以这种类型的引用是合法的。

注意警惕下面这个陷阱:

typedef struct
{
    int a;
    simple* b;
    int c;
}simple;

这个声明的目的是为结构创建类型名simple,但是是非法的,类型名直到声明的末尾才定义,所以在声明的内部是无法使用的。

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

结构体定义变量一共有两种方式,一种是在进行结构体声明的同时定义结构体变量,另一种是利用结构体类型来定义结构体变量。

struct S
{
	int x;
	int y;
}s1;        //声明类型的同时定义变量s1

struct S s2;  //利用结构体类型来定义变量p2

结构体变量的初始化和数组变量的初始化一样,在定义结构体变量的同时赋初值即可。

struct Stu        
{
	char name[10];
	int age;      
}s1 = { "wei", 20 };         

struct Stu s2 = { "yj", 21 };   

struct Node
{
	int data;
    struct Stu s1;
	struct Stu* next; 
}n1 = {10, {"wei",19}, NULL};            //结构体嵌套初始化

struct Node n2 = {20, {"yj", 22}, NULL};     //结构体嵌套初始化

4. 结构体内存对齐

结构体内存对齐是结构体大小的计算规则,经常出现在校招笔试和面试,对于下面的题,如果你没有了解过内存对齐规则,只凭借自身朴素的猜想,是很难做对的

//计算结构体大小
#include <stdio.h>
struct S1 
{
	char c1; //1
	int i;   //4
	char c2; //1
};

struct S2 
{
	char c1; //1
	char c2; //1
	int i;   //4
};

int main()
{
	printf("%d\n", sizeof(struct S1));
	printf("%d\n", sizeof(struct S2));
	return 0;
}

在这里插入图片描述

  • 结构体内存对齐规则
  1. 第一个成员在与结构体变量起始地址偏移量为0的地址处

  2. 其他成员变量要对齐到偏移量为它的对齐数的整数倍的地址处

    • 对齐数 = 编译器默认的对齐数与该成员变量大小的较小值

    • VS的默认对齐数是8.

    • 只有VS编译器下才有默认对齐数的概念,其他编译器下变量的对齐数 = 变量的大小

  3. 结构体总大小为最大对齐数的整数倍。(最大对齐数为所有成员的对齐数的最大值)

如果嵌套了结构体的情况,嵌套的结构体的对齐数是自己的最大对齐数,结构体的整体大小为所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

struct S1 
{
	char c1;  //变量大小为1,默认对齐数为8 -> 对齐数为1
	int i;    //变量大小为4,默认对齐数为8 -> 对齐数为4
	char c2;  //变量大小为1,默认对齐数为8 -> 对齐数为1
};  //最大对齐数为4

在这里插入图片描述

struct S2 
{
	char c1;  //变量大小为1,默认对齐数为8 -> 对齐数为1
	char c2;  //变量大小为1,默认对齐数为8 -> 对齐数为1
	int i;    //变量大小为4,默认对齐数为8 -> 对齐数为4
};    //最大对齐数为4

在这里插入图片描述


  • 为什么存在内存对齐
  1. 平台原因(移植原因):

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

  1. 性能原因:

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。

原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

总体来说:结构体的内存对齐是拿空间来换取时间的做法。

  • 减少空间损失
  1. 系统禁止编译器在一个结构的起始位置跳过几个字节来满足边界对齐要求,因此你可以在声明中对结构的成员重新排列,让那些对齐数大、对边界要求最严格的成员首先出现,这样可以最大程度减少因边界对齐而带来的空间损失,例如,下面这个结构
struct S1 
{
    int i;   //4
	char c1; //1
	char c2; //1
};

所包含的成员与上面那个结构一样,但是只占了8个字节,节省了很多空间。

  1. 修改默认对齐数

我们可以使用 #pragma 这个预处理指令,改变我们的默认对齐数

#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
     char c1;
     int i;
     char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

#pragma pack(1)//设置默认对齐数为1
struct S2
{
     char c1;
     int i;
     char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认

int main()
{
    //输出的结果是什么?
    printf("%d\n", sizeof(struct S1));
     printf("%d\n", sizeof(struct S2));
    return 0;
}

在这里插入图片描述

sizeof操作符能够得出一个结构的整体大小,包括因边界对齐而跳过的那些字节,如果你必须确定结构某个成员的具体位置(偏移量),应该考虑边界对齐因素,可以使用offsetof宏(定义于stddef.h)

size_t offset = offsetof(struct s1, i) //参数分别是结构体类型和成员名, 结果是size_t类型

5. 结构体传参

结构体传参有两种方式:一种是传递整个结构体,这时函数形参需要创建一个与原结构体同等大小的空间来接收,也就是把结构体拷贝一份压入堆栈,结构体过大浪费空间的同时会十分影响效率,并且这是传值调用,函数处理的是原结构体的一份拷贝,不会改变原结构体;

另一种是传递结构体的地址,这时无论原结构体有多大,形参都只需要用一个结构体指针来接收,把它压到堆栈上效率能提高很多,节省空间的同时提高效率。缺陷在于函数现在可以通过指针对原结构体进行修改,如果我们不希望如此,可以在函数中使用const关键字来防止这类修改。

struct S
{
	int data[1000];
	int num;
};
struct S s = { {1,2,3,4}, 1000 };

//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);//直接访问
}

//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);//间接访问
}

int main()
{
	print1(s);  //传结构体
	print2(&s); //传结构体地址
	return 0;
}

对于绝大多数情况,传递指针显然效率更高,很少有向函数传递结构的情况,只有当一个结构特别地小,结构传递方案的效率才不会输给指针传递方案,如果你希望修改结构的任何成员,也应该使用指针传递方案。

二. 位段

结构体讲完就得讲讲结构体实现 位段 的能力

1. 什么是位段

位段的声明和结构是类似的,有两个不同:

  1. 位段的成员必须是 int、unsigned int 、signed int 和 char(整型家族)

  2. 位段的成员名后边有一个冒号和一个数字,这个整数指定该成员所占bit的数目

2. 位段的声明

如果把位段声明为int类型,它究竟被解释为有符号数还是无符号数是有编译器决定的

struct A
{
 int _a:2;
 int _b:5;
 int _c:10;
 int _d:30;
};

3. 位段的内存分配

printf("%d\n", sizeof(struct A));

在这里插入图片描述

  • 内存分配规则
  1. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

  2. 位段涉及很多不确定因素,无法总结统一的内存分配规则,位段是不跨平台的,注重可移植的程序应该避免使用位段。

以下是VS2013环境下测试数据:

在这里插入图片描述

4. 位段的跨平台问题

下面这些与实现有关的依赖性,位段在不同的系统中可能有不同的结果

  1. int 位段被当成有符号数还是无符号数是不确定的。

  2. 位段中最大位的数目不能确定(16位机器最大16,32位机器最大32,写成27,在16位机

器会出问题)。

  1. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

  2. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是

舍弃剩余的位还是利用,这是不确定的。

在VS编译器下,位段的使用习惯是这样的:

  1. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,直接舍弃剩余的位;
  2. 位段中的成员在内存中是从右向左分配的;

5. 位段的应用

struct CHAR
{
    unsigned int ch:7;
    unsigned int font:6;
    unsigned int size:19;
};

这个声明取自一个文本格式化程序,说明位段能够把长度为奇数的数据包装在一起

位段的另一个常见的用途就是用于ip数据报,如下图:在这里插入图片描述

如图:在 ip数据报中,版本只占4个比特,头部长度只占4个比特,服务类型只占8个比特,如果这些数据我们都用一个整型大小,即32个比特位来存储的话,那么就会在一定程度上增加数据报的大小,从而增加网络负载,降低传输效率,所以在这里,位段的作用就得到了很好的体现。

总结:

跟结构相比,位段可以达到同样的效果,并且可以很好的节省空间,但是有跨平台的问题存在。

三. 枚举

枚举顾名思义就是一一列举,把可能的取值一一列举。

比如我们现实生活中:一周的星期一到星期日是有限的7天,可以一一列举,

性别有:男、女、保密,也可以一一列举。

月份有12个月,也可以一一列举

表示以上数据就可以使用枚举了

1. 枚举类型的定义

enum Day//星期
{
     Mon,
     Tues,
     Wed,
     Thur,
     Fri,
     Sat,
     Sun
};
enum Sex//性别
{
     MALE,
     FEMALE,
     SECRET
};
enum Color//颜色
{
     RED,
     GREEN,
     BLUE
};

这些大括号内部的枚举常量都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。

enum Color//颜色
{
 RED=1,
 GREEN=2,
 BLUE
};

部分没有赋初值的也是由前一个成员递增1

2. 枚举的优点

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

枚举的优点:

  1. 增加代码的可读性和可维护性

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

  3. 便于调试 :用 #define 定义的常量在程序的预处理阶段就会被替换掉,不便于调试观察

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

类型检查:枚举变量必须用枚举常量来赋值,而不能使用普通常量来赋值

在这里插入图片描述

3. 枚举的使用

enum Color//颜色
{
	RED = 1,
	GREEN = 2,
	BLUE = 4
};
enum Color clr = GREEN;  //使用枚举类型定义枚举变量并初始化
//只能拿枚举常量给枚举变量赋值,才不会出现类型的差异

四. 联合

1. 联合类型的定义

联合也是一种特殊的自定义类型,与结构相比,联合可以说是另一种生物了。

这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间(所以联合也叫共用体)

比如:

//联合类型的声明
union Un
{
     char c;
     int i;
};
//联合变量的定义
union Un un;
//计算联合变量的大小
printf("%d\n", sizeof(un));

在这里插入图片描述

2. 联合的特点

联合的所有成员引用的都是内存中的相同位置,当你想在不同时刻把不同的东西存入同一空间时,就可以使用联合,一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)

union Un
{
     int i;
     char c;
};
union Un un;
// 下面输出的结果是一样的吗?
printf("%d\n", &(un.i));
printf("%d\n", &(un.c));
//下面输出的结果是什么?
un.i = 0x11223344;
un.c = 0x55;
printf("%x\n", un.i);

在这里插入图片描述

因为联合体成员共用同一块内存空间,所以联合变量的地址与每个联合成员变量的地址都是相同的

3. 联合大小的计算

联合大小的计算规则如下:

  1. 联合的大小至少是最大成员的大小。
  2. 当最大成员大小不是最大对齐数的整数倍的时候,要对齐到最大对齐数的整数倍。
union Un1
{
     char c[5]; //1
     int i;     //4
};//最大对齐数:4

union Un2
{
     short c[7]; //2
     int i;      //4
};//最大对齐数:4

//下面输出的结果是什么?
printf("%d\n", sizeof(union Un1));
printf("%d\n", sizeof(union Un2));

在这里插入图片描述

PMP--工件 合同是指对双方都有约束力的协议,强制卖方提供规定的产品、服务或结果,以及强制买方支付相应的费用。它还可能包括处于中间状态的特性,例如已设计但尚未构建的特性、质量保证中的特性或测试中的特性。RACI 矩阵是一种常见的方法,用于显示执行、担责、咨询或知情,且与项目活动、决策和可交付物有关的干系人。计划是提议的实现某种目标的方式。在项目开始前或开始时创建的文件,涉及与项目有关的战略、商业或高层级的信息。或 © 它们是用特定方法创建的结果,例如,虽然成本估算结果是一个重要工件,它们是用不同估算方法得出的结果。 阅读详情

相关推荐

GNSS - PPP软件 - GAMP 在VS2019/2022下完成调试、跑通程序(超详细!)

WIN32;_DEBUG;_CONSOLE;O_WARNINGS;ENAGLO;ENACMP;ENAGAL;ENAQZS;NFREQ=3。

qq_43381998的博客 8247

C语言基础与总结(8)结构体、共用体、枚举

1、概念:结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合。2、 结构体类型的定义方法咱们在使用结构体之前必须先有类型,然后用类型定义数据结构这个类型相当于一个模具(1).先定义结构体类型,再去定义结构体变量struct 结构体类型名{成员列表int num;char sex;//有了结构体类型后,就可以用类型定义变量了//定义了三个 struct stu 类型的变量每个变量都有三个成员,分别是 num name sex。

darin_wang的博客 678

【物理模拟】PBD算法详解

参考MatthiaMuller的十分钟物理(他就是PBD算法的发明者)

beidou111的博客 9499

C#数据类型(转自荷塘秋色的博客)

C#编程中,大家会经常使用到不同的数据类型,那么C#编程语言到底有什么类型呢?具体如下: 1.1 值类型 各种值类型总是含有相应该类型的一个值。C#迫使你初始化变量才能使用它们进行计算-变量没有初始化不会出问题,因为当你企图使用它们时,编译器会告诉你。 每当把一个值赋给一个值类型时,该值实际上被拷贝了。相比,对于引用类型,仅是引用被拷贝了,而实际的值仍...

weixin_33834679的博客 319

MATLAB射线追踪算法实战:从零搭建通信信号传播模型(附完整代码)

本文提供了一份详细的MATLAB射线追踪算法实战指南,指导读者从零开始搭建通信信号传播模型。内容涵盖场景建模、射线发射、路径追踪与信号计算等核心环节,并附有完整代码,帮助通信与电子工程领域的学习者和工程师快速掌握这一精确模拟电磁波传播的关键技术。

weixin_29092031的博客 196

计算机视觉三大顶会(ICCV/CVPR/ECCV)投稿指南与趋势解析

本文详细解析计算机视觉三大顶会(ICCV/CVPR/ECCV)的投稿指南与最新趋势。从基础认知到实战经验,涵盖时间线管理、选题策略、论文写作技巧及实验设计要点,帮助研究者提升投稿成功率。特别关注2024年技术融合、评估维度和伦理要求等前沿趋势,为计算机视觉领域的研究者提供实用建议。

weixin_29165725的博客 1833

C语言------结构体、枚举类型

一、结构体    结构体的定义:          在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)

huhanze的专栏 949

有限差分法地震数据正演模拟(二)

正演模拟,是在地球物理勘探研究中,根据地质体的形状、产状和物性数据,通过构造数学模型计算得到其理论值(数学模拟),或通过构造实体模型来观测模型所产生的地球物理效应的数值(物理模拟)。p(t+1,x,z)即为下一时刻的波长信息,该波动方程的意义就是通过前一时刻(p(t-1,x,z))和现在时刻(p(t,x,z))预测下一时刻波的传播情况。声波波动方程:反应声波的传播规律,描述最简单的波现象的方程,p代表波场信息,v表示速度场信息因为速度只与速度场有关,所以只与x,z有关。其结果也可以作为反演的验证。

weixin_46285501的博客 3935

详解自定义类型:结构体,位段,枚举,联合

联合也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。//1int i;//4int main()按道理应该有5个字节但才占4个字节因为它是联合体 取最大的一个类型的字节。

chaodddddd的博客 503

【自动驾驶端到端5:VADv2: End-to-End Vectorized Autonomous Driving via Probabilistic Planning】

从大规模人类驾驶演示中学习类人驾驶策略是有希望的。但是,规划的不确定性使得从驾驶演示中提取驾驶知识是有挑战性的。从统计学习的角度来看,动作(包括实际和速度)是高度随机的,受许多无法建模的潜在因素影响。

weixin_40000560的博客 1404

阻抗匹配与史密斯(Smith)圆图

在找到点B和B'后,我们就能够测量A'到B和B'到D的弧长,前者就是C的归一化电纳值,后者为L的归一化电抗值。当然,表面上看新的点好像是一个不同的阻抗,实际上Z和1/Y表示的是同一个元件(这个新值在圆图上呈现为一个不同的点,而且反射系数也不相同,依次类推)。出现这种情况的原因是我们的图形本身是一个阻抗图,而新的点代表的是一个导纳。这个方程是在复平面(Γr, Γi)上、圆的参数方程(x - a)² + (y - b)² = R²,它以[r/(r + 1), 0]为圆心,半径为1/(1 + r)。

qq_55759599的博客 3961

【C语言】自定义类型详解:结构体、枚举、联合

C语言的数据类型包括基本类型(内置类型)、构造类型(自定义类型)、指针类型和空类型(void),其中基本类型就是我们常见的整形、浮点型,而自定义类型则包括数组、结构体、枚举、联合(共用体),数组我们已经非常熟悉了,今天我们主要学习自定义类型中其他几种类型结构体、枚举以及联合。结构体定义变量一共有两种方式,一种是在进行结构体声明的同时定义结构体变量,另一种是利用结构体类型来定义结构体变量。intx;inty;}p1;//声明类型的同时定义变量p1structPointp2;.........

在平淡的日子里寻找存在的价值 1428

AI Agent Harness Engineering 监控与日志系统搭建

在生成式AI(Generative AI)与大语言模型(LLM)普及的今天,AI Agent(自主智能代理)已经成为了继「LLM API调用」「单轮/多轮对话」之后的第三代AI应用范式——Agent能够自主感知环境、制定多步决策、调用外部工具(Web搜索、数据库、RAG检索、企业系统API等)、执行复杂任务并优化自身策略。然而,随着Agent应用从Demo原型快速落地到企业生产环境,一系列与工程化落地强绑定的可观测性(Observability)问题正在成为Agent项目成功上线、稳定运行的最大瓶颈。

AI开发架构师 184

详解自定义类型:结构体、枚举、联合体

详解结构体、枚举、联合体

Ljiyu0506的博客 396

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C语言】详解自定义类型:结构体,枚举,联合

C语言中有很多内置的数据类型例如:int double ...等等。但我们在现实中有很多复杂对象需要描述。C语言中描述复杂对象的方式分别有结构体,枚举,联合,本期博客就让我们一起学习它们吧!有了结构体类型,那如何定义变量,其实很简单。代码示例:int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化。

烧鸡配油茶的博客 1129

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[C语言]自定义类型详解:结构体、联合体、枚举

int x;int y;}s1;//声明类型的同时定义变量s1//定义结构体变量s2//结构体嵌套初始化int n;int main()enum Day//星期Mon,Tues,WedThur,Fri,Sat,Sunenum Sex//性别MALE,FEMALE,SECRET。

2401_83283514的博客 1899

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【C语言】——自定义类型详解:结构体,枚举,联合

【C语言】自定义类型详解

m0_71214261的博客 491

【C语言进阶】 详解自定义类型:结构体,枚举,联合

位段,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field)。利用位段能够用较少的位数存储数据。位段和结构体其实是非常相似的,但是有两个不同点:1. 位段的成员必须是或signed int。2. 位段的成员名后边有一个冒号和一个数字。举个例子struct Aint _a : 2;int _b : 5;首先我们要明白位段中的这个“位”字其实指的是二进制位。我们知道一个二进制位就是1个比特位。所以,A中。

m0_71731682的博客 2440

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

自定义类型详解:结构体(struct),枚举(enum),联合(union)

qq_55383558的博客 927

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

结构体 结构体的声明 //例如描述一个学生信息 struct Student // 方式一 { char name[20]; //姓名 char sex[5]; //性别 int age; //年龄 char tel[15]; //电话 char addr[30]; //地址 }stu; // stu = struct Student stu; //struct ...

m1059247324的博客 508

C语言进阶第八篇【三大自定义类型详解:结构体struct,枚举enum,联合union】

三大自定义类型详解:结构体struct,枚举enum,联合union

m0_61933976的博客 1556

C语言详解——自定义类型:结构体、枚举、联合体

你学过结构体、枚举、联合体吗?如果没学过就来我这里看看吧

VHhhbb的博客 1099

自定义类型:结构体,枚举,联合(详解版)

C语言自定义类型详解版(结构体、枚举、联合)

越努力越幸运 1007

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

本文对C语言结构体,联合,枚举的相关知识和具体使用做了详细的介绍

2402_83672777的博客 860

【C语言】自定义类型:结构体,枚举,联合详解

有了结构体类型,那如何定义变量,其实很简单。int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化int data;//结构体嵌套初始化//结构体嵌套初始化位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。

weixin_66400112的博客 938

【C语言】自定义类型详解:结构体、枚举、联合体

目录 一、结构体详解 1、结构体类型的声明 1.1.结构体是什么? 1.2.结构体声明 1.3.特殊的结构体声明(匿名结构体) 2、结构体的自引用 3、结构体变量的定义和初始化 4、结构体的内存对齐 内存对齐的规则是什么呢? 列1: 列2: 列3: 列4.内嵌结构体: 宏offsetof #pragram pack() 为什么会出现内存对齐? 5、结构体传参 6、结构体实现位段(填充&移植) 1.什么是位段? 2.位段的内存分配 3.位段跨平台的具体问.

weixin_63246064的博客 2503
上一篇: 字符串函数
下一篇: 动态内存分配
岸边露伴'
博客等级 码龄3年 2粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值