首页
学习
活动
专区
圈层
工具
发布

【C语言进阶篇】看完这篇结构体文章,我向数据结构又进了一大步!(结构体进阶详解)

注:上一篇结构体万字解析的链接《结构体的基础讲解》 1.2 结构的声明 1.2.1 . 匿名结构体类型声明 在声明结构的时候,也可以不完全的声明。...✅ 原因: 结构体重定义在结构体结束时最后一行才生效,但是我们在重定义生效之前就想使用这肯定回发生错误呢! 正确的做法是在结构体里面我们还是使用未重命名之前的标签名。...的定义和初始化 typedef重命名的结构体类型,只是定义与前面不一样,其他部分都是一样的!...但是重命名了,在声明后面就不能再创建我们的结构体变量了。 因为typedef 的定义结构体后面默认跟的是重命名的类型名。...前面结构体包含结构体的的初始化我们都知道了,那么自引用和它基本一样,自引用引用的是相同类型的地址所以我们可以先赋值为 NULL 空指针就好!

95710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Windows 编程(多进程)

    ,此线程负责执行包含在进程的地址空 间的中的代码.也就是,真正完成代码执行的是线程,而进程只是纯种的容器, 或者说是线程的执行环境....邮槽由服务端创建, 在创建时需要指定邮 槽名, 创建后服务端得到邮槽的句柄。 在邮槽创建后, 客户端可以通过邮槽名打开邮槽, 在获得句柄后可以向邮槽写入消息。...邮槽通信是单向的, 只有服务端才能从邮槽中读取消息, 客户端只能写入消息。 消息 是先入先出的。 客户端先写入的消息在服务端先被读取。...通过邮槽通信的数据可以是任意格式的, 但是一条消息不能大于 424 字节。 邮槽除了在本机内进行进程间通信外, 在主机间也可以通信。...匿名管道是一个没有命名的单向管道, 本质上就是一个共享的内存区域。

    1.2K10

    初识C++ · 模拟实现list

    在list类中,我们看到只有一个成员变量,即node,那么随着typedef看过去,就知道link_type是控制节点的类的指针类型。 迭代器具体等会再细说,现在大体模式了解了,就开始进入吧。...这里的所以typedef最好都放在限定符的后面,有时候是会报错的,比如找不到什么的,为了方便,这里就把ListNode重命名了Node。...= _head; } 当然,链表为空的时候_size是为0的,所以判断为空的条件有两个,我们选取任意一个都可以的。...按照上文的理解,我们只需要一个节点,所以成员变量只有一个Node* _node,这里也要用到重命名,因为类域不一样,所以我们不能接着用list中使用的typedef,这里创建好之后,我们应该进入下一个问题...模板也是必不可少的,因为是在类外实现的,所以我们需要类域访问限定符,这里用到的* ++ != 等操作我们都实现了,就可以完美实现打印。

    9710

    【C语言必学知识点六】自定义类型——结构体

    2.3 关键字typedef 在C语言中有一个可以对数据类型进行重命名的关键字——typedef。...2.3.2 typedef的使用 当我们在使用typedef时我们一定要注意,typedef只能够重命名数据类型,它是无法重命名变量名的,如下所示: 可以看到,当我们通过typedef来重命名变量时,系统会提示变量...这也就是为什么说匿名结构体只能够使用一次。并且由于匿名结构体的这种使用特性,导致它是无法进行自引用操作的。 这时有朋友可能就会说了,咱们不是可以通过typedef来进行重命名吗?...那我在声明匿名结构体时对其重命名不就好了吗?如下所示: 可以看到,当我们通过typedef对匿名结构体进行重命名后,它就可以多次使用了。那是不是就意味着它也能够执行结构体自引用操作了呢?...因此我们可以得到以下结论: 匿名结构体只能够在声明的同时创建变量,也就是匿名结构体只能使用一次; 当通过typedef将匿名结构体重命名后,该匿名结构体就能够多次使用; 不管有没有对匿名结构体进行重命名

    22210

    数据结构-线性表

    逻辑结构 线性表是具有相同数据类型的n(n≥0)个数据元素的有限 序列,其中n为表长,当n = 0时线性表是一个空表。若用L命名线性表,则其一般表示为: 相同:每个数据元素所占的空间一样大。...特点:在数据元素的非空有限集中 有且仅有一个开始结点。 有且仅有一个终端结点。 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。...O(1) 时间内找到第 i 个元素。...在表L中的**第i个位置上(位序)**插入指定元素e。...定义一个单链表 typedef 关键字 —— 数据类型重命名 typedef struct LNode { ElemType data;//数据域 struct LNode *next;//指针域

    11100

    【C语言】自定义类型:结构体深入解析(一)

    只能在定义它的代码块内使用,不能在其他地方再次使用这个匿名结构体类型。 思考:下⾯的两个结构在声明的时候省略掉了结构体标签(tag),然后主函数里的p = &x的代码合法吗?...匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。 结构的⾃引⽤ 结构的自引用指的是结构体内部包含自己类型的指针成员,通过这个指针可以实现结构体之间的引用关系。...代码运行: 图解分析: 思考2: 在结构体⾃引⽤使⽤的过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易引⼊问题,看看下⾯的代码,可⾏吗?...分析: 首先使用typedef给前面匿名结构体起了别名Node,还不是类型,但是在typedef语句内,struct定义部分还没有结束,所以在struct内部使用Node声明next时,Node类型还未通...typedef获得定义,仅仅是对匿名结构体的一个重命名,就提前使⽤Node类型来创建成员变量。

    21510

    C语言结构体、联合与枚举类型

    此外,还有一种特殊的结构体类型———匿名结构体,顾名思义匿名结构体就是没有给结构体赋予名字,那么若想创建匿名结构体变量只能在结构体声明后才能创建,在函数内部不可创建,当然也不推荐大家用匿名结构体类型,毕竟能使用匿名结构体类型的场景很少..." , s1.name, s1.age, s1.sex, s1.height); return 0; } 执行结果如下: 以上就是结构体成员点运算符访问, 其实除了点运算符访问外还有一种特殊的访问方式...4.typedef 与结构体 struct + 结构体名称这种写法有时候会不会太过冗长了呢,C语言提供了一个很好的解决这种冗长代码的关键字 ,typedef 关键字可以将类型进行重命名...,类如typedef int size_t,那么size_t就与int是同样功能,同理typedef出现在结构体前面,对结构体进行重命名,可以避免冗长的代码给人更好的阅读体验 。...关键字搭配结构体是一种减少代码冗长的好手段,在这里需要注意的是typedef关键字要写在结构体声明之前,重命名要写在大括号之后分号前,之后在使用重命名+结构体变量是不是方便许多了呢?

    23010

    List类的超详细解析!(超2w+字)

    ① 将数据给给 _val ② 将 _next 和 _prev 都置成空 这些任务我们可以写到 struct ListNode 的构造函数中,我们还可以设计成全缺省,给一个匿名对象 T() 。...list_node Node; //将节点重命名为Node typedef list_iterator Self; //将迭代器重命名为Self public...若我们将反向迭代器的名称设为 reverse_iterator,且将 typedef 后的重命名也设为 reverse_iterator,会导致在设置 const 版本的反向迭代器的时候,编译器会到上一行或者前面找这个重名的...reverse_iterator,而不会去类外找我们的反向迭代器类,这样子就导致了报错,所以注意在用 typedef 重命名时候不要与下面迭代器的类名重复了!...; //将节点重命名为Node typedef list_iterator Self; //将迭代器重命名为Self public: // Ref 和 Ptr

    91130

    模拟实现vector迭代器失效问题

    ,然后在命名空间里面创建vector类: namespace my_vector { template class vector { public: typedef T* iterator...因为reserve是不会缩容的,缩容和扩容是需要代价的,而扩容是不可避免的,但是缩容就不必要了,采用空间换时间的策略。 在最初状态,_start是指向空指针的,因此在扩容的时候需要判断一下。...size_t oldSize = size(); T* tmp = new T[n]; if (_start)//判断一下_start是否为空,因为如果一开始的capacity是空的,然后赋值为...当_finish等于_start的时候,说明此时容器是空的,没有空间,没有数据。...那么插入的数据的话,缺省值是T(),即匿名对象,因为T有可能是string类型,是Date类型,是各种各样的类型,因此需要它的构造函数去初始化。

    47520

    【C语言指南】数据类型详解(下)——自定义类型

    C语言内置类型可参考上一篇文章: 【C语言指南】数据类型详解(上)——内置类型-CSDN博客 引言 在C语言中,除了丰富的内置数据类型外,自定义数据类型也是编程中不可或缺的一部分。...: 匿名联合体:在某些情况下,可以定义匿名联合体,以便直接访问其成员而无需通过联合体名。...枚举(Enum,自定义用法的高级特性) 枚举类型是一种用户定义的类型,它包含一组命名的整型常量。 虽然枚举本质上不是自定义数据类型(因为它基于整型),但其自定义用法和高级特性使得它非常强大。...类型定义(Typedef) typedef关键字用于为现有的数据类型定义一个新的名字(别名)。 使用typedef可以简化复杂的类型声明,提高代码的可读性。...函数指针的简化:typedef特别适用于简化函数指针的类型声明,使得回调函数和函数指针的使用更加直观。

    23010

    Google C++ 编程风格指南(二):作用域

    命名空间很容易令人迷惑,毕竟它们不再受其声明所在命名空间的限制。内联命名空间只在大型版本控制里有用。...在头文件中使用匿名空间导致违背 C++ 的唯一定义原则 (One Definition Rule (ODR)). 结论: 根据下文将要提到的策略合理使用命名空间. 2.1.1....匿名名字空间 在 .cc 文件中, 允许甚至鼓励使用匿名名字空间, 以避免运行时的命名冲突: namespace { // .cc 文件中 //...// 使用本名字空间内的符号 EOF } // namespace 然而, 与特定类关联的文件作用域声明在该类中被声明为类型, 静态数据成员或静态成员函数, 而不是匿名名字空间的成员....(在项目外可用)以及它们递归包含的其它头文件里,不要用别名。

    92830

    list的介绍及其模拟实现

    今天我们了解list,list在python中是列表的意思 ,但是在C++中它是一个带头双向循环链表: list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代...list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。...next; list_node(const T& x = T()) :_data(x) , _prev(nullptr) , _next(nullptr) {} }; 然后我们就可以在命名空间内定义...list类了: 为了可读性和代码的简洁,我就用Node来作为list_node的重命名了 namespace jh { template struct list_node {...: 迭代器最常用的点就是++和–,因为我们需要用迭代器来初始化等等,我们就首先在结构体内重载++和–: 括号后面又int的我们之前的博客也进行学习过,它是后置,编译器会自动识别的,temp就是一个匿名对象

    11610

    【C语言基础】:自定义类型(一)--> 结构体

    1.2 自定义类型 在C语言中,除了内置的基本数据类型外,还可以通过结构体(Structures)和枚举类型(Enums)来定义自定义类型。...匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使用一次。...正确的自引用方式: struct Node { int data; struct Node* next; }; 在结构体自引用使用的过程中,夹杂了 typedef 对匿名结构体类型重命名,也容易出现引入问题...typedef struct { int data; struct Node* next; }Node; 这种也是错误的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用...解决方案如下:定义结构体不要使用匿名结构体了 typedef struct Node { int data; struct Node* next; }Node; 三、结构体内存对齐 【示例】:计算结构体的大小

    18810

    【C语言】你不知道的知识小盲区——柔性数组

    (int));    以上操作就是为带有柔性数组的结构体Stu开辟空间,给除了柔性数组外的其它成员开辟空间我们采用的就是sizeof(Stu),然后再加上柔性数组的大小,上述代码中就为柔性数组开辟了10...int i; int arr[]; }Stu;    上面的代码中,我们创建了一个带有柔性数组的结构体,将其重命名为了Stu,由于我们要指定空间内容,所以我们可以把其中的i用来表示柔性数组...,不能直接用原来的指针p来接收,因为一旦realloc开辟空间失败返回了空指针,那么我们就找不到原数据了    所以我们这里重新创建一个变量tmp来接收,然后判断它是否为空,不为空再传给我们的p,如果为空那么就直接打印错误信息...实际上也不陌生,就是我们上一篇在动态内存管理中讲过的malloc模拟实现数组的功能的办法,使用一个整型指针来当作一个数组的首元素,然后给它开辟空间,把这段连续空间当作数组使用,首先创建如下结构体: typedef...我们还需要先释放开辟的数组的空间,把它置为空指针,再释放掉p,将p置为空指针,所以 最后真正完整的代码如下: #include #include typedef

    26610

    C语言自定义类型之结构体

    : 结构的特殊声明 在声明结构时,可以不完全声明 比如: //匿名结构体类型 struct { int a; char b; float c; }x; struct { int a; char...p = &x; 答案是否定的,编译器会把上⾯的两个声明当成完全不同的两个类型,所以是⾮法的。 匿名的结构体类型,如果没有对结构体类型重命名的话,基本上只能使⽤⼀次。...结构的自引用 在结构中包含一个类型为该结构本身的成员应注意什么呢?...typedef 对匿名结构体类型重命名,也应注意定义的先后顺序,避免混淆 typedef struct { int data; Node* next;//因为Node是对前⾯的匿名结构体类型的重命名产...⽣的,但是在匿名结构体内部提前使 //⽤Node类型来创建成员变量,这是不⾏的。

    17910

    【c++】探究C++中的list:精彩的接口与仿真实现解密

    默认构造函数创建一个没有任何元素的空链表。 填充构造函数允许创建一个包含特定数量相同值的元素的链表。 范围构造函数可以从任何提供迭代器接口的其他容器复制元素。...让我们分两部分来解释这个代码: namespace own:命名空间 own 用于封装代码,避免与其他库中的同名类型或函数冲突。在这个命名空间中,定义了模板类 ListNode 和模板类 list。...这种设计方式提供了良好的封装和组织结构,在集合和容器类(如 list)中是一种常见做法 迭代器就是一个节点的指针,我们这个类的成员就是_node(节点指针) typedef ListNode...这个匿名的 A 对象是通过调用它的构造函数来直接初始化的,并立即被传递到 push_back 函数中。...通过隐式类型转换创建匿名对象并插入: lt.push_back({ 3, 3 }); 与第三种方式类似,创隐式类型转换建了一个匿名的 A 对象,但这次是通过。

    31710

    vector的模拟实现

    : 首先为了和库里面的vector混淆视听,放入自己命名的空间里,并且根据vector的源码分析我们得出了三个成员变量: 分别是: 其实他们实质上都是指针,位置大概是这样的,遵循左闭右开的规则...jh { template class vector { public: typedef T* iterator; typedef const T* const_iterator...+的一个匿名函数,通常我们所说匿名对象的生命周期只有一行,但是用const修饰后的匿名对象的生命周期会延长!...,然后将其全部置为空 ~vector() { delete[] _start; _start = _finish = _endofstorage = nullptr; } swap函数 swap函数其实我们的用处不大...时才会扩容,向前几篇博客所说的,不会进行缩容,然后我们记录有效元素个数sz=size(提前记录好是因为后面会进行delete释放原本start空间的操作),如果start不为空,就将start中的元素按照深拷贝的方式用

    12410

    【C语言】深入解开指针(四)

    *操作符对它进行解引用,得到void ()类型的匿名函数。 对这个匿名函数进行调用(),也就是调用0地址处的地址。...由于指针指向0地址,实际调用的是内核NULL地址下的代码。这通常会触发异常或者崩溃。 所以这个代码展示了一个通过函数指针调用匿名函数的语法,它实际上是在尝试访问空指针下的代码从而触发错误。...typedef 是⽤来类型重命名的,可以将复杂的类型,简单化。 C语言中的typedef主要用于定义类型别名。...本小节由于篇幅有限,我们先讲第一点: ⽐如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写: 1 typedef int(*parr_t)[5]; //新的类型名必须在...*的右边 函数指针类型的重命名也是⼀样的,⽐如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写: 1 typedef void(*pfun_t)(int);//新的类型名必须在*的右边

    20610
    领券