C语言-----自定义类型-----结构体枚举联合

结构体和数组一样,都是一群数据的集合,不同的是数组当中的数据是相同的类型,但是结构体中的数据类型可以不相同,结构体里的成员叫做成员变量

结构体类型是C语言里面的一种自定义类型,我们前面已经了解到过int,char,float,double等数据类型,结构体也是一种数据类型,而且是使用者自己定义的数据类型,用法如下:

1.结构体类型的声明

struct stu
{char name[20];int age;char sex;
};

2.结构体变量的创建和初始化

结构体变量.结构体成员------对应的参数进行打印

​
struct stu
{char name[20];int age;char sex;
};struct stu t={"小明",15,"男"};​
struct stu
{char name[20];int age;char sex;
}s1={"小明",15,"男"};
//这种是在声明结构体同时定义变量
//也可以额外定义struct stu s1={"小明",15,"男"};struct stu s1={.name="小明",.age=15,.sex="男"};//这种可以不按照顺序

3.结构体传参

#include<stdio.h>
struct  s
{int num;
};struct s t = 100;
void print1(struct s t)
{printf("%d\n", t.num);
}void print2(struct s *p)
{printf("%d\n", p->num);
}int main()
{print1(t);print2(&t);return 0;
}

这里给出了传值,传地址两种方式,当参数较大时候,传参时候压栈会使得系统在时间空间的开销过大,所以尽量使用传地址的形式;

4.结构的自引用

一个结构体里面不能够包含一个相同的结构体,但是我们可以使用结构体指针,线性数据结构包括顺序表和链表,顺序表就是按照一定的顺序依次排列的结构,链表就是像链子一样串连起来的结构,链表包括数据域和指针域,数据域用来储存相应的数据,指针域便于找到下一个数据;

struct Node
{int time;struct Node* next;
};
//这种引用的方法是正确的,如果不使用指针,我们无法计算结构体的大小,所以们我们用结构体指针
typedef struct
{int time;Node* next;
}Node;
//这个是对匿名结构体的重新命名,这种写法是错误的因为Node没有定义就是用了Node*

5.结构体的大小--内存对齐现象

(1)结构体的第一个成员对齐到结构体变量起始偏移量是0的地方

(2)对齐数是编译器的默认对齐数8和结构体成员变量的较小值

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

(4)结构体嵌套结构体的时候,嵌套的结构体成员对齐到自己成员最大对齐数的整数倍,整个结

构体的大小就是所有结构体成员最大对齐数的整数倍(把内置的嵌套结构体也当作一个结构体成

员);

(5)根据结构体的对齐规则,我们应该尽量让小的结构体成员放在一起,大的结构体成员放在一

起,这样就可以节省时间和空间;

6.结构体实现位段功能

(1)位段中的位是指二进制位,一个二进制位是一个比特,举个例子:int a:2;正常情况下,一个整型a

要占4个字节,也就是32个比特位,但是我们只为他分配2个比特位来存放数据,2的二进制表示是

0020,2个比特位就存放后两位20,这样就节省了6个比特位,由此可见,位段就是为了节省内存

空间,但是位段不具有跨平台性;

(2)位段有时候几个成员共同使用1个字节,所以不能对他直接取地址,所以应该定义变量,对变

量输入一个值,然后将这个变量的值赋值给结构体的成员;

8.枚举

枚举就是把可能的值一一列举,比如一周有7天

枚举类型的使用,当然,我们在使用的时候可以给枚举常量赋值;

9.联合体(共用体)

联合体的成员共同使用一块内存空间,一起使用的时候会影响彼此的数值,所以联合体的使用条件就是联合体的成员不会同时使用,互不影响;

这个案例是使用匿名联合体判断机器是大端还是小端;

10.联合体的大小

联合体的大小至少是最大成员的大小;

但是通过上面这个案例,我们可以知道联合体也有对齐现象,char是5个1,int是4;但是满足最大对齐数4的整数倍,所以是8;

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

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

相关文章

ChatGPT高效提问—prompt常见用法(续篇九)

ChatGPT高效提问—prompt常见用法(续篇九) ​ 如何准确地向大型语言模型提出问题,使其更好地理解我们的意图,从而得到期望的答案呢?编写有效的prompt的技巧,精心设计的prompt,获得期望的的答案。 1.1 增加条件 ​ 在各种prompt技巧中,增加条件是最常用的。在prompt中…

【漏洞复现】狮子鱼CMS某SQL注入漏洞01

Nx01 产品简介 狮子鱼CMS&#xff08;Content Management System&#xff09;是一种网站管理系统&#xff0c;它旨在帮助用户更轻松地创建和管理网站。该系统拥有用户友好的界面和丰富的功能&#xff0c;包括页面管理、博客、新闻、产品展示等。通过简单直观的管理界面&#xf…

2024年 前端JavaScript入门到精通 第一天

主要讲解JavaScript核心知识&#xff0c;包含最新ES6语法&#xff0c;从基础到API再到高级。让你一边学习一边练习&#xff0c;重点知识及时实践&#xff0c;同时每天安排大量作业&#xff0c;加深记忆&#xff0c;巩固学习成果。 1.1 基本软件与准备工作 1.2 JavaScript 案例 …

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

力扣面试题 17.04. 消失的数字(求和,位运算)

Problem: 面试题 17.04. 消失的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:求和 先求取1-n的数字和,再减去数组中所有元素的和即为缺失数 思路2:位运算 我们利用异或运算的特性:相同位为0,不同位为1;0与仍何数异或后得到仍何数,即我们先另一个变量(初始为0)与…

1Maven分模块设计与开发

目录 1.1 介绍 1.2 实践 1.2.1模块进行拆分 1.3 总结 首先&#xff1a;Maven 是一款构建和管理 Java 项目的工具 1.1 介绍 所谓分模块设计&#xff0c;顾名思义指的就是我们在设计一个 Java 项目的时候&#xff0c;将一个 Java 项目拆分成多个模块进行开发。 1). 未分模…

SpringCloud-高级篇(十九)

我们已经学过使用 SpringAMQP去收和发消息&#xff0c;但是发和收消息是只是MQ最基本的功能了&#xff0c;在收发消息的过程中&#xff0c;会有很多的问题需要去解决&#xff0c;下面需要学习rabbitMQ的高级特性去解决 死信交换机&#xff1a;这个可以帮助我们实现消息的延迟的…

深入了解Elasticsearch索引生命周期管理

在今天的数据驱动世界中&#xff0c;Elasticsearch因其强大的搜索和分析能力而受到许多企业和开发者的青睐。随着数据量的不断增长&#xff0c;如何高效地管理这些数据成为了一个挑战。Elasticsearch索引生命周期管理&#xff08;ILM&#xff09;就是为解决这一问题而设计的。本…

数据库管理-第14期 Oracle Vector DB AI-01(20240210)

数据库管理149期 2024-02-10 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xff09;1 机器学习2 向量3 向量嵌入4 向量检索5 向量数据库5 专用向量数据库的问题总结 数据库管理-第149期 Oracle Vector DB & AI-01&#xff08;20240210&#xf…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 本就是小人物&#xff0c;输了就是输了&#xff0c…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

蓝桥杯每日一解

可以看看a的ascii码为6532 而A为ascii码为65&#xff0c;大小写相差32位 #include <iostream>using namespace std; int main(){int n;cin >> n;char a;for (int i 1;i<n;i){while(scanf("%c",&a) ! EOF){//无限输入直到输入到空格if(a a || a …

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言快捷栏绘制UI代码控制快捷列表信息 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中&#xff0c;我们将探索如何制作…

Linux开发工具的使用 (gcc/g++ | gdb)

目录 一、gcc/g 1.关于gcc/g 2.gcc如何使用 gcc选项&#xff1a; 预处理&#xff1a; 编译: 汇编: 连接: 函数库是什么&#xff1a; 函数库分为动态库和静态库两种 二、调试器gdb 1.关于gdb 2. gdb的使用 gdb选项&#xff1a; Linux是一个广泛用于开发的操作系统&…

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

vue核心技术(二)

◆ 指令补充 指令修饰符 通过 "." 指明一些指令 后缀&#xff0c;不同 后缀 封装了不同的处理操作 → 简化代码 v-bind 对于样式控制的增强 为了方便开发者进行样式控制&#xff0c; Vue 扩展了 v-bind 的语法&#xff0c;可以针对 class 类名 和 style 行内样式…

KAJIMA CORPORATION CONTEST 2024(AtCoder Beginner Contest 340)ABCDEF 视频讲解

这场比较郁闷&#xff0c;C题短路&#xff0c;连续4次WA&#xff0c;导致罚时太多 A - Arithmetic Progression Problem Statement Print an arithmetic sequence with first term A A A, last term B B B, and common difference D D D. You are only given inputs for w…

BootstrapBlazor 模板适配移动设备使用笔记

项目模板 Bootstrap Blazor App 模板 为了方便大家利用这套组件快速搭建项目&#xff0c;作者制作了 项目模板&#xff08;Project Templates&#xff09;&#xff0c;使用 dotnet new 命令行模式&#xff0c;使用步骤如下&#xff1a; 安装项目模板 dotnet new install Boo…

007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码&#xff0c;离了指针是很难办到的。 2、因为VB/VBA里&#xff0c;用Long来表示指针&#xff0c;而32位(包括64位兼容的)计算机里4字节整数的处理&#xff0c;是最快的方式&#xff01; 3、要想用指针来处理数据&#xff0c;…