C语言_自定义类型详解

这篇具有很好参考价值的文章主要介绍了C语言_自定义类型详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

一.结构体的声明

1.1结构体的基础知识

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


1.2结构的声明

C语言_自定义类型详解,c语言,算法,数据结构

1.3特殊声明

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

//匿名结构体类型
//匿名结构体类型一般只能用一次
struct
{
    int a;
    char b;
    float c;
}x;
struct
{
    int a;
    char b;
    float c;
}*p ;
int main()
{
    p = &x;  //err
    return 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;
}
C语言_自定义类型详解,c语言,算法,数据结构

结构体里嵌套结构体

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;
}

运行结果:
C语言_自定义类型详解,c语言,算法,数据结构


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

C语言_自定义类型详解,c语言,算法,数据结构
  • offsetof 宏 这个宏可以计算结构体成员相较于结构体其实位置的偏移量 ;头文件 #include<stddef.h>
C语言_自定义类型详解,c语言,算法,数据结构

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

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

1.7修改默认对齐数

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


1.8 结构体传参

C语言_自定义类型详解,c语言,算法,数据结构

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

二.位段

2.1 什么是位段

  • 1.位段的成员必须是 int、unsigned int 或 signed int 。
  • 2.位段的成员名后边有一个冒号和一个数字。
C语言_自定义类型详解,c语言,算法,数据结构

2.2 位段的内存分配

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

2.3位段的跨平台问题

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

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


2.4 位段的应用

C语言_自定义类型详解,c语言,算法,数据结构

三.枚举

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

3.1枚举类型的定义

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

C语言_自定义类型详解,c语言,算法,数据结构C语言_自定义类型详解,c语言,算法,数据结构

3.2 枚举优点

C语言_自定义类型详解,c语言,算法,数据结构

四.联合(共用体)

联合也是一种特殊的自定义类型。
这种类型的定义的变量包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)
文章来源地址https://www.toymoban.com/news/detail-739390.html

C语言_自定义类型详解,c语言,算法,数据结构

4.1 联合大小的计算

  • 联合的大小至少是最大成员的大小。
  • 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
C语言_自定义类型详解,c语言,算法,数据结构

到了这里,关于C语言_自定义类型详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)五

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月23日
    浏览(50)
  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)三

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月21日
    浏览(48)
  • 结构体和数据结构--从基本数据类型到抽象数据类型、结构体的定义

            在冯-诺依曼体系结构中,程序代码和数据都是以二进制存储的,因此对计算机系统和硬件本身而言,数据类型的概念其实是不存在的。         在高级语言中,为了有效的组织数据,规范数据的使用,提高程序的可读性,方便用户使用,引入了整型、实型等基本数

    2024年02月11日
    浏览(48)
  • 详解C语言自定义类型(结构体,枚举,联合)

    ❤️ 作者简介 :RO-BERRY 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱 📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新 🎄结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不

    2024年02月16日
    浏览(40)
  • 【C语言】——自定义类型详解:结构体,枚举,联合

    大家好,今天为大家分享一下C语言中的那些自定义类型:结构体,枚举,联合,还有之前可能不曾了解的结构体内存对齐、位段等知识点!!! 一、结构体 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构的声明 : 例如描述一个学生

    2024年02月07日
    浏览(51)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(53)
  • C语言进阶,第4节-自定义类型详解(结构体

    1. 结构的声明 //描述一个学生 //匿名结构体类型 编译器会把上面两种声明当做完全不同的两个类型 2. 结构体自引用 //正确的自引用方式: 注意: 3. 结构体变量定义和初始化 //定义 //初始化 4. 结构体内存对齐 //结构体对齐规则 : //例 1 //例 2 //为什么存在内存对齐?( 结构体

    2024年02月16日
    浏览(40)
  • C语言——自定义类型详解[结构体][枚举][联合体]

    我打算把结构体、枚举、联合体的重点内容总结一下,方便后期复习的时候能够更快,更准确的去拾取遗忘的知识。也希望能给大家起到借鉴的作用,不足的地方,请多多包涵。(不足的地方,也希望大家能够指出来) 结构体是一些值的集合,这些集合称为成员变量,结构体

    2024年02月13日
    浏览(42)
  • python常见的数据类型与数据结构(一)数字类型 字符串类型 布尔类型 列表 集合 字典 的定义与常规操作方法

    数字类型有int(整数),float(浮点数)和complex(复数型),其中int与float被大家所常用并且可以使用int()和float()函数相互转换。如果字符串只包含数字和小数点也可以被这两种函数强制转换。复数型,则少被人们使用,大都是用在数学公式和物理公式的计算上。 字符串类型较为简单

    2024年02月21日
    浏览(51)
  • 【数据结构和算法初阶(C语言)】复杂链表(随机指针,随机链表的复制)题目详解+链表顺序表结尾

    目录  1.随机链表的复制 1.2题目描述  1.3题目分析 1.4解题: 2.顺序表和链表对比 2.1cpu高速缓存利用率 3.结语 一个长度为  n  的链表,每个节点包含一个额外增加的随机指针  random   该指针可以指向链表中的任何节点或空节点。        构造这个链表的  深拷贝 。 深拷贝

    2024年03月10日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包