【C语言自定义类型之----结构体,联合体和枚举】

一.结构体

1.结构体类型的声明

srruct tag
{
  nemer-list;//成员列表
}varible-list;//变量列表

结构体在声明的时候,可以不完全声明。 

例如:描述一个学生

struct stu
{
	char name[20];//名字
	int age;//年龄
	char sex[20];//性别
};//分号不能省略

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

struct point
{
	int x;
	int y;
}p1;//声明类型的同时,定义变量p1

struct point p2 = { 10,20 };//定义结构体变量p2,并初始化

struct stu
{
	char name[20];
	int age;
};
struct stu s1 = { "zahngsan",20 };//初始化
struct stu s2 = { .age = 20,.name = "wnagwu" };//指定初始化


//结构体嵌套初始化
struct Node
{
	int data;
	struct point p;
	struct Node* next;
}n1 = { 20,{4,5} ,NULL};  
struct Node n1 = { 20,{4,5} ,NULL };

3.结构体成员访问操作符

3.1直接访问操作符(. ),接受两个操作数。

使用方式:结构体变量.成员名

3.2对于结构体的指针而言的间接访问操作符(->)。

使用方式:结构体指针->成员名

3.3解引用操作符(*)。

指向结构体类型变量的指针也可以通过.方式访问成员,只不过要先通过*对该指针解引用

#include <stdio.h>
struct point
{
	int x;
	int y;
};

int main()
{
	struct point p = { 3,4 };
	struct point* ptr = &p;
	ptr->x = 10;
	ptr->y = 20;
	printf("x=%d y=%d\n", ptr->x, ptr->y);
	return 0;
}

4.结构体内存对齐(计算结构体的内存大小)

首先得掌握对齐规则:

4.1.结构体成员的第一个成员对齐到和结构体起始位置偏移量为0的地址处.

4.2.其他成员的要对齐到某个数字(对齐数)的整数倍处.

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

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

4.4.如果结构体中嵌套了结构体,嵌套的结构体成员对齐到自己成员中最大对齐数的整数倍处

,结构体的整体大小就是所有成员中最大对齐数的整数倍处.

补充:

​​​​修改编译器的默认对齐数:

struct S
{
	char c1;
	int i;
	char c2;
};

int main()
{
	struct S s = { 0 };
	printf("%d ", sizeof(s));
	return 0;
}

注:

当然我们也可以通过使用#pragma pack( ) ,来修改默认的对齐数,与此同时也可以用它来取消修改。

5.结构体实现位段(内存针对的是比特位,会发生截断现象)

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

5.1 位段的成员必须是int,unsigned int ,或者signed int,在c99中位段成员的类型也可以选择其他类型。

5.2位段的成员的后边有一个冒号和一个数字。

二.联合体(共用体)

1.联合体的声明

#include <stdio.h>

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

2.联合体的特点

联合体的成员是共用一块内存空间的,这样一个联合一体变量的大小,至少是最大成员的大小,(因为联合至少得有能力保存最大的那个成员)。

三.枚举(列举---把可能的值一一列举)

1.枚举类型的声明

enum color
{
	red,
	green,
	blue
};

{ }中的内容是枚举类型的可能取值,也叫枚举常量。当然 ,在声明枚举类型的时候也可以赋初值。 

2.枚举类型的优点

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

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

2.3便于调试,预处理阶段会删除#define定义的符号.

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

2.5枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内声明.

3.枚举类型的使用

enum color
{
	red = 1,
	green=2,
	blue=4
};

enum color clr = green;//使用枚举常量给枚举变量赋值

内容如有有错误,还望指出!

关注博主,优质内容不断更新!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

静态模板编译:提高Web性能的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SpringBoot3整合RabbitMQ之二_简单队列模型案例

SpringBoot3整合RabbitMQ之二_简单队列模型案例 文章目录 SpringBoot3整合RabbitMQ之二_简单队列模型案例1. 简单队列模型1. 消息发布者1. 创建简单队列的配置类2. 发布消费Controller 2. 消息消费者3. 输出结果 1. 简单队列模型 简单队列模型就是点对点发布消息&#xff0c;有…

(二)小案例银行家应用程序-创建DOM元素

● 上图的数据很明显是从我们账户数组中拿到了&#xff0c;我们刚刚学习了forEach&#xff0c;所以我们使用forEach来创建我们的DOM元素&#xff1b; const displayMovements function (movements) {movements.forEach((mov, i) > {const type mov > 0 ? deposit : w…

Nacos 入门篇---客户端如何发起服务注册?怎么发送服务心跳的(二)

一、引言 上个章节我们简单学习和使用了下Nacos服务自动注册&#xff0c;本文就来分析下Nacos客户端自动注册服务是怎么实现的&#xff5e; 二、目录 目录 一、引言 三、Nacos 源码编译 1.1 拉取代码 1.2 运行起来 四、客户端使用版本选择 五、Nacos客户端项目启动为什么会…

c++的学习之路:14、list(1)

本章讲一下如何使用list 一、list介绍 首先还是看一看官方文档的介绍如下图&#xff0c;如下方五点&#xff1a; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链…

阿里微服务质量保障系列:域内测试

进入阿里之前&#xff0c;我就职的公司所在部门的产品都是单体应用&#xff0c;例如第一家公司是做投顾平台的&#xff0c;第二家公司所在的团队是做在线教育的&#xff0c;负责的产品是内容生产平台。投顾平台这个产品是服务于券商投顾员工的&#xff0c;属于券商内部应用&…

公开课学习——仿抖音直播平台

文章目录 直播抖音的直播原理Java继承直播客户端工具&#xff1a; ffmpeg客户端和网页集成CDN网络——性能提升关键——边缘计算 实时聊天——IM系统怎么实现&#xff1f;——websocketIM系统消息如何转发&#xff1f;直播场景IM系统是什么样子&#xff1f; 直播 抖音的直播原…

R语言实现:统计学及计量专业中的多种平均值计算方式

平均值在计量专业和统计学中有着广泛的应用如&#xff1a;描述数据集中趋势、比较不同组数据、评估数据的代表性、决策和判断、回归分析概率统计与财务分析等。此外&#xff0c;在计量专业中&#xff0c;平均值还被广泛应用于各种测量和校准过程中&#xff0c;以确保测量结果的…

34.Python从入门到精通—Python3 正则表达式检索和替换

34.从入门到精通&#xff1a;Python3 正则表达式检索和替换 repl 参数是一个函数 正则表达式对象 正则表达式修饰符 - 可选标志 正则表达式模式* 正则表达式实例 检索和替换repl 参数是一个函数正则表达式对象正则表达式修饰符 - 可选标志正则表达式模式*正则表达式实例 检索和…

动规训练4

目录 一、买股票的最佳实际含冷冻期 1、题目解析 2、算法原理 a状态表示方程 b状态转移方程 c初始化 d填表顺序 e返回值 3、代码 4、感想 二、买股票的最佳时机函手续费 1、题目解析 2、算法原理 a状态表示方程 b状态转移方程 c初始化 d填表顺序 e返回值 3、…

STM3定时器输入捕获、超声波测距

1、超声波测距模块介绍 1、HC-SR04共四个引脚&#xff1a;VCC、GND、Trig、Echo&#xff0c;如下图 2、使用 1、通过gpio口向Trig引脚发送一个脉冲信号。 2、HC-SR04接收到脉冲信号后&#xff0c;就会向外发送一段超声波&#xff0c;模块会将echo拉高。 …

Web CSS笔记3

一、边框弧度 使用它你就可以制作盒子边框圆角 border-radius&#xff1a;1个值四个圆角值相同2个值 第一个值为左上角与右下角&#xff0c;第二个值为右上角与左下角3个值第一个值为左上角, 第二个值为右上角和左下角&#xff0c;第三个值为右下角4个值 左上角&#xff0c;右…

舞蹈网站制作分享,舞蹈培训商城网站设计案例分享,wordpress主题分享

嘿&#xff0c;朋友们&#xff01;今天我要跟你们唠一唠一个超级酷炫的舞蹈培训商城网站设计案例。 咱先说说这个网站的目标哈&#xff0c;那就是得让喜欢舞蹈的小伙伴们能够轻轻松松找到自己心水的课程和商品。 那制作过程都有啥呢&#xff1f;别急&#xff0c;听我慢慢道来。…

c# wpf LiveCharts 绑定 多线条 简单试验

1.概要 c# wpf LiveCharts 绑定 多线条 简单试验 2.代码 <Window x:Class"WpfApp3.Window4"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http:…

清明假期作业

1、实现文件夹的拷贝功能 注意判断被拷贝的文件夹是否存在&#xff0c;如果不存在则提前 不考虑递归拷贝的问题 #include<myhead.h> int my_copy(char* name,const char *p) {char buf[256]"./";strcat(buf,p);strcat(buf,"/");strcat(buf,name);in…

P1001 A+B Problem

1.题目背景 强烈推荐新用户必读帖。 不熟悉算法竞赛的选手请看这里&#xff1a; 算法竞赛中要求的输出格式中&#xff0c;**不能有多余的内容&#xff0c;这也包括了“请输入整数a和b” 这一类的提示用户输入信息的内容。**若包含了这些内容&#xff0c;将会被认为是Wrong Answ…

嵌入式Qt QGridLayout网格布局管理器

一.QGridLayout网格布局管理器 //以行为单位 设置比例系数 void QGridLayout::setRowStretch ( int row, int stretch ) //以列为单位 设置比例系数 void QGridLayout::setColumnStretch ( int column, int stretch ) 实验&#xff1a; Widget.h&#xff1a; #ifndef _WIDGE…

dm8数据迁移工具DTS

dm8数据迁移工具DTS DTS工具介绍 DM数据迁移工具提供了主流大型数据库迁移到DM、DM到DM、文件迁移到DM以及DM迁移到文件的功能。DM数据迁移工具采用向导方式引导用户通过简单的步骤完成需要的操作。 DM数据迁移工具支持&#xff1a; ◆ 主流大型数据库Oracle、SQLServer、MyS…

3.6 CSS定位

CSS定位可以将HTML元素放置在页面上指定的任意地方。CSS定位的原理是把页面左上角的点定义为坐标为(0,0)的原点&#xff0c;然后以像素为单位将整个网页构建成一个坐标系统。其中x轴与数学坐标系方向相同&#xff0c;越往右数字越大&#xff1b;y轴与数学坐标系方向相反&#x…

r3live使用realsense避免相机内参标定

话题 /camera/color/camera_info 消息格式 sensor_msgs/CameraInfo distortion_model&#xff1a;指定了相机畸变模型&#xff0c;"plumb_bob"简单的径向和切向畸变模型 D&#xff1a;畸变参数&#xff0c;取决于畸变模型&#xff0c;(k1, k2, t1, t2, k3)&#xf…