C语言_自定义类型详解

文章目录

  • 前言
  • 一.结构体的声明
    • 1.1结构体的基础知识
    • 1.2结构的声明
    • 1.3特殊声明
    • 1.4结构体的自引用
      • 在结构中包含一个类型为该结构本身的成员是否可以?
      • 正确的自引用方式
      • 匿名结构体类型和typedef的结合形式
    • 1.5 结构体变量的定义和初始化
      • 结构体定义与初始化
      • 结构体里嵌套结构体
    • 1.6 结构体内存对齐 -- 计算结构体大小
    • 1.7修改默认对齐数
    • 1.8 结构体传参
  • 二.位段
    • 2.1 什么是位段
    • 2.2 位段的内存分配
    • 2.3位段的跨平台问题
    • 2.4 位段的应用
  • 三.枚举
    • 3.1枚举类型的定义
    • 3.2 枚举优点
  • 四.联合(共用体)
    • 4.1 联合大小的计算


前言

提示:这里可以添加本文要记录的大概内容:

一.结构体的声明

1.1结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量
数组:一组相同类型的集合。


1.2结构的声明


1.3特殊声明

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

//匿名结构体类型
//匿名结构体类型一般只能用一次
struct
{int a;char b;float c;
}x;
struct
{int a;char b;float c;
}*p ;
int main()
{p = &x;  //errreturn 0;
}

上面的两个结构体在声明的时候省略掉了结构体标签(tag)
那么在上面代码的基础上,下面的代码合法吗?

p=&x;

警告: 编译器会把上面的两个声明当成完全不同的两个类型。所以是非法的。

1.4结构体的自引用

在结构中包含一个类型为该结构本身的成员是否可以?

代码如下:

//struct Node
//{
//    int data;
//    struct Node next;
//};
// 不可行,本质上是错误的 Node next ---  4/8
//                                ---  next
//                                --- 无穷                      

正确的自引用方式

struct Node
{int data;struct Node *next;
};

匿名结构体类型和typedef的结合形式

错误样例:


typedef struct 
{int data;Node *next;
}Node;

解决方案:

typedef struct Node
{int data;struct Node *next;
}Node;

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

结构体定义与初始化

struct SN
{char c; int i;}sn1 = { 'q',100 }, sn2 = {.i=200,.c='w'};//全局变量int main()
{printf("%c %d\n", sn2.c, sn2.i);return 0;
}

结构体里嵌套结构体

struct SN
{char c; int i;}sn1 = { 'q',100 }, sn2 = {.i=200,.c='w'};//全局变量struct S
{double d; struct SN sn ;int arr[10];};int main()
{//printf("%c %d\n", sn2.c, sn2.i);struct S s = { 3.14,{'a',99},{1,2,3} };printf("%lf %c %d\n", s.d, s.sn.c, s.sn.c, s.sn.i);int i = 0;for (i = 0; i < 10; i++){printf("%d ", s.arr[i]);}return 0;
}

运行结果:


1.6 结构体内存对齐 – 计算结构体大小

  • offsetof 宏 这个宏可以计算结构体成员相较于结构体其实位置的偏移量 ;头文件 #include<stddef.h>

上面的现象分析,我们发先结构体成员不是按照顺序在内存中连续存放的,而是有一定的对齐规则的。
结构体内存对齐的规则:

  • 1.结构体的第一个成员永远放在相较于结构体变量起始位置的偏移量为0的位置。
  • 2.从第二个成员开始,往后的每个成员都要对齐到某个对齐数的整数倍。
对齐数:结构体成员自身的大小和默认对齐数的较小值。 VS上默认对齐数是8; gcc没有默认对齐数,对齐数就是结构体成员的自身大小。
  • 3.结构体的总大小,必须是最大对齐数的整数倍.
    最大对奇数是:所有成员的对齐数中最大的值。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

1.7修改默认对齐数

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


1.8 结构体传参

首选print2函数,函数传参的时候,参数需要压栈,会有时间和空间上的系统开销。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。

二.位段

2.1 什么是位段

  • 1.位段的成员必须是 int、unsigned int 或 signed int 。
  • 2.位段的成员名后边有一个冒号和一个数字。

2.2 位段的内存分配

  • 1.位段的成员可以是 int unsigned int signed int 或者是char (属于整形家族)类型
  • 2.位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的。
  • 3.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

2.3位段的跨平台问题

  • 1.int 位段被当成有符号数还是无符号数是不确定的。
  • 2.位段中最大位的数目不能确定。(16位机器最大,32位机器最大,写成27,在16位机器会出现问题)。
  • 3.位段中的成员在内存中从左向右,还是从右向左分配标准尚未定义。
  • 4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

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


2.4 位段的应用


三.枚举

枚举顾名思义就是一一列举。
把我们的取值一一列举。

3.1枚举类型的定义

枚举,里面是枚举的可能取值,逗号。


3.2 枚举优点

四.联合(共用体)

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

4.1 联合大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

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

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

相关文章

【Linux进程】再谈软件—操作系统(Operator System)

目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。 笼统的理解&#xff0c;操作系统…

【python】路径管理+路径拼接问题

路径管理 问题相对路径问题绝对路径问题 解决os库pathlib库最终解决 问题 环境&#xff1a;python3.7.16 win10 相对路径问题 因为python的执行特殊性&#xff0c;使用相对路径时&#xff0c;在不同路径下用python指令会有不同的索引效果&#xff08;python的项目根目录根据执…

利用Graviton2和S3免费套餐搭建私人网盘

网盘是一种在线存储服务&#xff0c;提供文件存储&#xff0c;访问&#xff0c;备份&#xff0c;贡献等功能&#xff0c;是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制&#xff0c;比如限制下载速度&#xff0…

下载树莓派对应的64位Ubuntu系统步骤

说点废话&#xff1a;因为ros2需要安装在64位Ubuntu上面&#xff0c;所以安装64位最合适&#xff1b; 第一步打开https://cn.ubuntu.com/ 网站&#xff1b;选择下载--->iot----> 选择这个镜像文件下载。我觉得镜像文件是img格式的&#xff0c;跟iso文件区别是&#xff…

vue详细安装教程

这里写目录标题 一、下载和安装node二、创建全局安装目录和缓存日志目录三、安装vue四、创建一个应用程序五、3x版本创建六、创建一个案例 一、下载和安装node 官网下载地址&#xff1a;https://nodejs.org/en/download 选择适合自己的版本&#xff0c;推荐LTS&#xff0c;长久…

【计算机网络】计算机网络中的基本概念

文章目录 局域网LAN基于网线直连基于集线器组建基于交换机组建基于交换机和路由器组建 广域网WANIP地址端口号协议为什么要有协议知名协议的默认端口 五元组协议分层TCP/IP五层模型封装和分用 网络互连就是将多台计算机连接在一起&#xff0c;完成数据共享。数据共享本质是网络…

C++设计模式_23_Command 命令模式

我们将Command 和Visitor归为“行为变化”模式。 Command 命令模式与函数对象十分类似&#xff0c;但在C主流框架中&#xff0c;函数对象&#xff08;function object&#xff09;应用的更为广泛。 文章目录 1. “行为变化”模式1.1 典型模式 2. 动机( Motivation )3. 模式定义…

【Leetcode】【消失的数字】【C语言】

方法一&#xff1a;按位异或&#xff08;找单身狗&#xff09; 我们知道&#xff1a;按位异或^操作原则&#xff1a;相同为零&#xff0c;相异为一 所以 0^aa a ^a0 a ^bb ^a int missingNumber(int* nums, int numsSize){ int i 0; int tem1 0,tem20; for (i 0;i < nu…

大厂面试题-介绍一下自己对Netty

目录 用三点来简单的介绍下Netty&#xff1a; 面试官&#xff1a;哦&#xff0c;还不错&#xff0c;那你在说说为什么要用Netty&#xff1f; 面试官&#xff1a;那你在通俗地说一下Netty可以做什么事情&#xff1f; 面试官&#xff1a;那&#xff0c;在说说Netty有几种线程…

XUbuntu22.04之simplenote支持的Markdown语法总结(一百九十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

linux下df -h 命令一直卡住的解决方法

在Linux中&#xff0c;偶尔遇到用 df -h 查看磁盘情况时&#xff0c;一直卡住无法显示结果。 解决方法&#xff1a; 1、首先使用strace追踪到底执行到哪里卡住 $ strace df -h 2、如果没有strace命令则进行安装 $ yum install strace -y 3、显示出卡住的地方&#xff0c;如…

SpringBoot源码透彻解析—bean生命周期

先跟一段debug再看总结&#xff1a; 1 创建实例 InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation&#xff08;自定义一个对象或者代理对象&#xff09;createBeanInstance&#xff08;创建实例&#xff09;MergedBeanDefinitionPostProcessor.postProcess…

编程怎么学才高效?初学编程怎么样才容易入门?

学习编程并提高编程能力需要一种结构化的方法&#xff0c;其中包括理解基础概念、实践、反馈和持续学习。以下是一些高效学习编程的策略&#xff1a; 理解基础概念&#xff1a;在学习编程的初期&#xff0c;理解基础概念非常重要。这包括学习编程语言的基本语法、数据类型、控…

Java调用HTTPS接口,绕过SSL认证

1&#xff1a;说明 网络编程中&#xff0c;HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议&#xff0c;跟http相比更安全&#xff0c;因为他加上了SSL/TLS协议来加密通信内容。 Java调…

算法与数据结构-分治算法

文章目录 什么是分治算法分治算法应用举例分析分治思想在海量数据处理中的应用 什么是分治算法 分治算法&#xff08;divide and conquer&#xff09;的核心思想其实就是四个字&#xff0c;分而治之 &#xff0c;也就是将原问题划分成 n 个规模较小&#xff0c;并且结构与原问…

JavaEE入门介绍,HTTP协议介绍,常用状态码及含义,服务器介绍(软件服务器、云服务器)

一、JavaEE入门 JavaEE&#xff08;Java Enterprise Edition&#xff09;&#xff0c;Java企业版&#xff0c;是一个用于企业级web开发&#xff08;不需要使用控制台&#xff09;平台。最早由Sun公司定制并发布&#xff0c;后由Oracle负责维护。 JavaEE平台规范了在开发企业级w…

3D RPG Course | Core 学习日记三:Navigation智能导航地图烘焙

前言 前面我们已经绘制好了一个简单的地图场景&#xff0c;现在我们需要使用Navigation给地图做智能导航&#xff0c;以实现AI自动寻路&#xff0c;以及设置地图的可行走区域以及不可行走区域&#xff0c;Navigation的基础知识、原理、用法在Unity的官方文档&#xff0c;以及网…

cocos creator,vscode打开脚本报错,找不到cc模块问题

cocosCreator&#xff0c;用VSCODE打开写脚本代码的时候&#xff0c;会误报飘红&#xff0c;但实际上能正常运行。 我的版本是当前最新版本的3.8.1 解决方案: 在CocosCreator 的安装目录下 C:\ProgramData\cocos\editors\Creator\3.8.1\resources\resources\3d\engine\bin.dec…

人工智能AI 全栈体系(十一)

第一章 神经网络是如何实现的 这些神经网络越来越复杂&#xff0c;都是用BP算法求解。网络有些变化就可能需要重新推导&#xff0c;而在实验过程中可能会做很多尝试&#xff0c;这样每次都重新推导BP算法太麻烦了。 十、深度学习框架 现在有了很多深度学习框架&#xff0c;这…

OPENCV 闭运算实验示例代码morphologyEx()函数

void CrelaxMyFriendDlg::OnBnClickedOk() {hdc this->GetDC()->GetSafeHdc();// TODO: 在此添加控件通知处理程序代码string imAddr "c:/Users/actorsun/Pictures/";string imAddr1 imAddr"rice.png";Mat relax, positive;relax imread(imAddr1…