【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;//声明类型的同时,定义变量p1struct 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;//使用枚举常量给枚举变量赋值

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

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

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

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

相关文章

C语言实现快速排序算法

1. 什么是快速排序算法 快速排序的核心思想是通过分治法&#xff08;Divide and Conquer&#xff09;来实现排序。 算法的基本步骤是: 1. 选择一个基准值&#xff08;通常是数组中的某个元素&#xff09;&#xff0c;将数组分成两部分&#xff0c;使得左边的部分所有元素都小于…

Open CASCADE学习|在给定的TopoDS_Shape中查找与特定顶点 V 对应的TopoDS_Edge编号

enum TopAbs_ShapeEnum{TopAbs_COMPOUND,TopAbs_COMPSOLID,TopAbs_SOLID,TopAbs_SHELL,TopAbs_FACE,TopAbs_WIRE,TopAbs_EDGE,TopAbs_VERTEX,TopAbs_SHAPE}; 这段代码定义了一个名为 TopAbs_ShapeEnum 的枚举类型&#xff0c;它包含了表示不同几何形状类型的常量。这些常量通常…

刷题之Leetcode283题(超级详细)

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nu…

【了解下Oracle】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

golang 选择排序

学习笔记&#xff5e; // Author sunwenbo // 2024/4/6 21:49 package mainimport "fmt"/* 选择排序基本介绍选择式排序也属于内部排序法&#xff0c;是从预排序的数据中按指定的规则选出某一元素&#xff0c;经过和其他元素重整&#xff0c;再依原则交换位置后达到…

快速了解FastAPI与Uvicorn是什么?

概念 什么是Uvicorn Python Uvicorn 是一个快速的 ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;服务器&#xff0c;用于构建异步 Web 服务。它基于 asyncio 库&#xff0c;支持高性能的异步请求处理&#xff0c;适用于各种类型的 Web 应用程序。 Uvi…

RUST语言值所有权之内存复制与移动

1.RUST中每个值都有一个所有者,每次只能有一个所有者 String::from函数会为字符串hello分配一块内存 内存示例如下: 在内存分配前调用s1正常输出 在分配s1给s2后调用报错 因为s1分配给s2后,s1的指向自动失效 s1被move到s2 s1自动释放 字符串克隆使用

窜天猴AI直播软件功能列表

迎新点名&#xff1a;新进直播间的用户随机指数级自由组合话术&#xff0c;并播报出来 礼物/关注&#xff1a;用户送礼物、关注以及灯牌事件同上根据话术指数级随机组合出来评论区关键字回复&#xff1a;用户评论后&#xff0c;根据预设置的关键字进行语音回复 自动寻品&…

IDEA2023创建SpringMVC项目

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案

【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案 大家好 我是寸铁&#x1f44a; 总结了一篇【Redis】MISCONF Redis is configured to save RDB snapshots报错解决方案✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天在登录redis时&#xff0c…

在GAZEBO中添加GPS模拟

文章目录 卫星导航能给机器人提供什么信息&#xff1f;gazebo测试环境 卫星导航能给机器人提供什么信息&#xff1f; 正常工作时&#xff0c;实际上可以提供机器人所需的所有定位信息&#xff0c;包括&#xff1a; 位置 姿态 速度等物理量 但是仅依靠卫星导航还不足以让机…

极客时间: 用 Word2Vec, LangChain, Gemma 模拟全本地检索增强生成(RAG)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…