自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(46)
  • 收藏
  • 关注

原创 Linux操作系统之进程(五):初识地址空间

在上一篇文章命令行参数与环境变量中,我们深入探讨了命令行参数与环境变量的作用和机制,了解到它们是进程启动时传递信息的重要手段,也是用户与程序交互的基础方式。然而,这些信息最终都要“落地”到内存中,供进程访问与使用。那么问题来了:程序中的所有数据、代码、参数,它们在内存中是如何组织和存放的?为什么同一个变量在父子进程中地址看似相同,却可能指向不同的内存?操作系统又是如何保障不同进程间互不干扰、独立运行的?为了解答这些问题,我们就必须进一步深入理解进程的地址空间结构。

2025-06-06 17:45:02 1044 5

原创 Linux操作系统之进程(四):命令行参数与环境变量

本文介绍了Linux系统中的命令行参数与环境变量。命令行参数通过main函数的argc和argv传递,决定程序执行的不同功能;环境变量则是系统级别的全局配置,通过envp或getenv()访问,影响所有子进程的行为。重点讲解了PATH、HOME、USER等关键环境变量的作用,并对比了环境变量与本地变量的差异:环境变量具有全局性,可被子进程继承。文章还演示了如何修改PATH环境变量,以及通过配置文件永久生效的方法。掌握这些概念有助于理解Linux系统的工作机制和程序交互方式。

2025-05-30 23:00:38 1249 6

原创 Linux操作系统之进程(三):进程优先级与进程切换调度

本文深入讲解了Linux进程管理的核心概念。首先解释了进程优先级(PRI)及其修正值(NI),通过示例演示了如何用top命令修改优先级(范围-20到19)。其次详细剖析了进程切换机制,包括上下文数据的保存与恢复。重点介绍了Linux2.6的O(1)调度算法,阐述了active和expired双队列的工作原理,以及位图优化查找过程。文章还补充了PCB双链表实现原理和C语言offset计算技巧。整体从优先级、切换、调度三个维度系统性地解析了Linux进程管理机制,适合有一定Linux基础的读者深入理解进程调度原

2025-05-25 19:39:31 1005 1

原创 Linux操作系统之进程(二):进程状态

本文深入探讨了Linux操作系统中进程的各种状态及其行为。首先,文章介绍了进程的基本概念,包括并行与并发的区别、时间片的分配以及等待的本质。接着,详细解释了Linux中常见的进程状态,如运行(R)、睡眠(S)、不可中断睡眠(D)、停止(T)、僵尸(Z)和死亡(X),并通过代码示例展示了这些状态的实际表现。此外,文章还讨论了僵尸进程和孤儿进程的形成及其对系统的影响。通过本文,读者可以更好地理解进程状态在系统编程和性能调优中的重要性。

2025-05-21 20:23:41 1288 2

原创 Linux操作系统之进程(一):进程属性与进程创建

本文深入探讨了操作系统中的进程管理,重点介绍了进程控制块(PCB)的作用及其关键属性。进程是运行中的程序,由代码、数据和PCB组成,其中PCB是进程的核心数据结构,存储了如PID、状态、资源等所有管理信息。文章通过类比医院管理,形象地解释了操作系统如何通过PCB管理进程,包括资源分配、隔离保护和效率提升。此外,还详细介绍了进程的标识(PID和PPID)、进程的独立性、进程的查看与管理(如/proc文件系统和fork()系统调用),以及进程的工作目录(CWD)。理解这些概念对于深入学习Linux系统编程至关重

2025-05-13 20:51:05 1257 4

原创 操作系统的初步了解

操作系统(OS)是计算机系统的核心软件,负责管理硬件资源、运行软件、存储数据和提供用户界面。它通过事件管理机制高效处理硬件中断、用户输入和程序请求,确保系统稳定、高效、安全地运行。操作系统的事件管理遵循“先描述,再组织”的原则,使用数据结构和队列来管理事件。系统调用是操作系统提供的底层服务接口,而库函数则是对系统调用的封装,简化了开发过程。操作系统作为硬件与软件之间的桥梁,使复杂的计算机操作变得简单易用,是现代数字世界的基石。理解操作系统的管理哲学,有助于更高效地驾驭技术,探索更广阔的可能性。

2025-05-09 23:23:41 771

原创 Linux系统下的Makefile解析

Makefile是软件开发中的自动化构建工具,它定义了如何将源代码转换为可执行程序的完整过程。就像厨师需要食谱来指导烹饪过程一样,开发者需要Makefile来指导构建过程。Makefile的核心是依赖关系和构建规则的集合。在Linux/Unix开发环境中,Makefile通常与make命令配合使用,能够:自动化编译过程处理多文件项目的复杂依赖只重新编译修改过的文件提供统一的构建接口# 定义编译器# 定义编译选项使用$(变量名)来引用变量Makefile的核心就是:定义目标(要生成什么)

2025-05-03 13:12:14 876

原创 深入理解C++中的仿函数:从priority_queue到map/set的自定义排序

仿函数(Functor),也称为函数对象(Function Object),是一个类或结构体,它重载了operator(),使得这个类的对象可以像函数一样被调用。(优先队列)默认是最大堆,即最大的元素在顶部。但有时我们需要最小堆或自定义的排序规则。在priority_queue比较大小的时候,是通过一个仿函数进行比较的(默认使用的是less),这个仿函数重载了()运算符。假设我们有一个Personpublic:int age;{}//这是一个默认构造函数。

2025-04-18 10:44:20 785 1

原创 新手入门:快速上手循环单链表与双链表

作为数据结构中的重要内容,链表是每个程序员必须掌握的基础知识,上节课我们讲了带头单链表的模拟实现,今天我就为大家带来循环带头单链表与循环带头双链表的简单讲解,这几者之间差异不大,本质上就是寻找到你即将进行操作的节点,随后进行插入操作或者删除操作。希望能够对大家有所帮助。循环单链表是单链表的一种特殊形式,它的最后一个节点的指针不是NULL,而是指向头节点,形成一个环。每个节点结构仍然由一个数据域与一个指向下一个节点的指针域构成:int data;int data;//存储数据//指向下一个节点。

2025-04-10 15:07:03 851 1

原创 链表的基础反转操作精讲

更关键的,我们需要将prew移动到pcur,也就是a节点的位置,因为我们下一个即将要反转的节点的目标是a。这是一个链表的反转的过程,如果想要实现它,就以b的反转来看,我们是不是需要知道b的位置啊,除此之外,我们也需要知道b->next指针即将指向的节点位置,也就是a节点的位置。这个应该是一个十分基础的题目了,看一下示例,题目给我们一条单链表(注意这个链表时不带头的单链表),要求我们把这个链表的每个节点的顺序进行反转,例如给我们一个链表的元素,按顺序依次打印结果为:1 2 3 4 5,。希望对大家有所帮助!

2025-04-09 07:54:30 326

原创 数据结构基础:链表专题

链表是数据结构中最基础也是最重要的线性表之一,它克服了数组固定大小的缺点,能够动态地进行内存分配。本文将全面介绍链表的概念、基本操作以及实际应用,帮助C语言初学者掌握这一重要数据结构。一、链表基础概念链表是⼀种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加几节。如果将⽕⻋⾥的某节⻋厢去掉/加上,其他⻋厢也不会受到影响,因为每节⻋厢都是独⽴存在的,且每节⻋厢都有⻋⻔。

2025-04-08 01:28:35 842

原创 C语言实现简单的控制台贪吃蛇游戏精讲

今天来给大家讲一下从零开始写项目经常会遇见的问题,就是你明明学了学校老师讲的知识,会做了那些题,但一当自己想要独立写个小项目时却无从下手的情况。这是因为平时的项目经验是在太少了,刷题的思维逻辑也并没有转换过来。有些同学尝试看b站的一下教程来写游戏,但写到一半却发现很多库函数,头文件都是自己没学到的,就误以为自己还没学完,没资格写项目,其实这就走进了误区。我们要从练中学,而不是学了之后再练!

2025-04-03 20:48:20 1116 2

原创 并查集:简单认识与模拟

并查集(Disjoint-Set Union,DNF)是一种用于高效处理不相交集合合并与查询的数据结构。在一些应用问题中,我们时常会遇见需要将n个元素划分到一些不相交的集合内,开始时,每个自成一个单元素集合,随后根据一些规律,将归于同一组的集合进行合并。在此过程中要反复用到查询某个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。譬如,加里敦大学的25招生计算机班中共招有20名学生,分别来自全国各地。

2025-03-27 15:33:17 865

原创 C++11:现代C++的演变与提升

在2003年,C++标准委员会发布了一份技术勘误表(简称TC1),使得C++03取代了C++98成为C++标准的最新版本。然而,C++03(TC1)主要集中于修复C++98中的缺陷,而语言的核心部分并没有重大变化。因此,人们通常将这两个标准统称为C++98/03。C++11,这个被称为“C++0x”的标准,经过十年的发展终于正式发布。与C++98/03相比,C++11带来了许多显著的变化和改进。

2024-09-26 00:09:16 1073 5

原创 高阶数据结构之哈希表基础讲解与模拟实现

哈希表(Hash Table)是一种高效的键值对存储数据结构,广泛应用于各种需要快速查找的场景,如数据库索引、缓存系统、集合等。它的基本思想是通过哈希函数将键映射到哈希表中的一个位置,从而实现快速的数据插入、删除和查找操作。下面我们将详细介绍哈希表的工作原理、实现方式、优缺点以及应用场景。哈希表作为一种重要的数据结构,提供了高效的查找、插入和删除操作。通过设计良好的哈希函数和适当的冲突解决策略,可以最大化哈希表的性能。

2024-09-12 23:11:55 1204 2

原创 二叉搜索树进阶之红黑树

红黑树在计算机科学中有着广泛的应用,尤其是在需要频繁插入和删除操作的数据结构中。虽然其实现较为复杂,但红黑树通过严格的平衡规则和旋转操作,能够提供稳定、高效的性能表现,是一种非常重要的自平衡二叉搜索树。了解红黑树的基本性质和操作过程,对于深入理解高级数据结构以及其在实际应用中的优化是非常有帮助的。希望本文对您有所帮助!!

2024-08-29 22:00:35 1007 4

原创 搜索二叉树进阶之AVL树

AVL树是Adelson-Velsky和Landis在1962年发明的一种自平衡二叉搜索树。它的特点是通过对树进行旋转操作来保持平衡,以确保在最坏情况下,树的高度仍然是O(log n),从而保证插入、删除和查找操作的时间复杂度都是O(log n)。AVL树作为自平衡二叉搜索树的经典实现,通过对树的高度进行严格控制,确保了高效的查找、插入和删除操作。尽管其操作复杂度较高,但在需要频繁查找和维护较大数据集的场景中,AVL树无疑是一种值得选择的数据结构。

2024-08-23 23:50:45 978 7

原创 map与set容器初识:初步运用map与set

在本文中,我们通过多个实际例题,深入探讨了map和set容器的常见操作和实际应用。这些容器在处理数据的过程中能够提供强大的支持,尤其在涉及到元素的唯一性、快速查找和数据关联的场景下。学习map和set容器不仅仅是掌握其基本用法,更重要的是通过实践,理解它们在不同场景中的应用和优势。本文的示例和解析,希望能帮助读者更好地掌握这些工具,并在今后的算法和编程实践中更加得心应手。通过不断练习,读者可以熟练地将map和set应用于各种复杂的数据处理任务中,从而提升编程效率和代码质量。

2024-08-21 21:58:23 1240 8

原创 二叉树进阶之二叉搜索树:一切的根源

在学完了简单的容器与C++面向对象的三大特性之后,我们首先接触的就是map与set两大容器,但是这两个容器底层实现的原理是什么呢?我们不而知,今天,主要来为学习map与set的底层原理而打好基础,而二叉搜索树,则是一切的开端......一、二叉搜索树的定义与性质: 对于每个节点N,其左子树中所有节点的值都小于N,右子树中所有节点的值都大于N。: 对二叉搜索树进行中序遍历(左-根-右)时,节点的值按升序排列。: 在平均情况下,查找、插入和删除操作的时间复杂度都是 O(log n)。

2024-08-17 21:59:38 893 12

原创 Linux初启征程指南:攻克常见系统指令与权限初理解

Linux是一个基于UNIX的开源操作系统,其核心(Kernel)是由Linus Torvalds在1991年首次发布的。它的设计初衷是为个人计算机提供一个免费的、开源的操作系统,但由于其强大的性能和安全性,如今被广泛应用于服务器、超级计算机、嵌入式系统等多个领域。因此对于我们这群程序员来说,学好Linux也自然是不可避免的事情。(糟糕,头发不保了!!!)下面就斗胆让作者我来给大家介绍一下Linux系统的常用指令啦。注意,以下指令的演示都是通过Xshell,CentOS 7.6 64bit版本进行。

2024-08-08 22:01:07 1006 5

原创 继承与多态常见面试题解析

3. 面向对象设计中的继承和组合,下面说法错误的是?()A:继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复用,也称为白盒复用B:组合的对象不需要关心各自的实现细节,之间的关系是在运行时候才确定的,是一种动态复用,也称为黑盒复用C:优先使用继承,而不是组合,是面向对象设计的第二原则D:继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封装性的表现。

2024-07-26 00:41:52 1121 5

原创 探索C++中的多态性:理解虚函数和运行时多态

在现代软件开发中,面向对象编程(OOP)已经成为了主流。其中一个强大的概念就是多态性(Polymorphism),它不仅仅是一种技术,更是一种设计思想和实现方式,为软件开发带来了巨大的灵活性和可维护性。多态性允许我们使用统一的接口来处理不同类型的对象,同时根据对象的实际类型来调用适当的方法。这种动态绑定的特性不仅提高了代码的复用性和可扩展性,还使得软件系统能够更好地适应变化和需求的增加。本博客将深入探讨C++语言中多态性的各个方面:从基本概念到实际应用,从虚函数到虚函数表,从继承到接口隔离。

2024-07-23 23:41:06 957 4

原创 C++面向对象三大特性:继承

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。对象组合是类继承之外的另一种复用选择。

2024-07-20 23:26:26 887 1

原创 C++初阶编程:list容器的简单模拟实现

在C++标准库中,list是一种双向链表容器。这里简单提一下双向链表——什么是双向链表呢?一个存储数据的字段。(我们通常用_data表示)一个指向前驱节点的指针。(我们通常用_prev表示)一个指向后继节点的指针。(我们通常用_next表示)这样,每个节点都知道它的前一个节点和后一个节点,从而支持在常数时间内进行插入和删除操作。在实现list之前,我们要先定义一下这个链表的节点结构。一个链表是有多个节点链接组成,所以节点自然是重中之重。

2024-06-29 19:45:42 956 1

原创 C++编程:vector容器的简单模拟实现

在C++标准库(STL)中,vector容器是最常见使用的动态数组。它结合了链表与数组的优点,提供了灵活的大小调整与高效的随机访问。本文将简单的对vector容器进行介绍并且对vector容器简单的模拟实现。1. vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector。

2024-06-16 21:44:51 1083 2

原创 C++编程:模板初阶

函数模板是一种用于定义一组相关函数的蓝图。这些函数模板在使用时会根据实参类型生成具体的函数版本。T c = a;a = b;b = c;(typename是用来定义模板参数的关键字,也能用class代替)在编译时,编译器会根据传入的实参类型生成具体类型的函数。Swap(a, b);// 编译器生成处理int类型的Swap函数Swap(x, y);// 编译器生成处理double类型的Swap函数。

2024-06-01 21:29:39 894 4

原创 C++动态内存管理:与C语言动态内存管理的差异之争

在C++中,内存管理是一个至关重要的主题。正确地管理内存可以避免内存泄漏和内存访问错误等问题,提高程序的性能和可靠性。本文将深入探讨C++中的内存管理机制,包括从C语言内存管理到C++内存管理转变,二者的关联等内容。和new/delete都是从堆上申请空间,并且需要用户手动释放。不同的地方是:1. malloc和free是函数,new和delete是操作符2. malloc申请的空间不会初始化,new可以初始化3. malloc申请空间时,需要手动计算空间大小并传递,

2024-05-10 21:41:45 1023 10

原创 类与对象(下)

终于来到了我们类和对象的最后一部分,类与对象下。在这部分中,我们主要讲解类与对象的“插件” ,也就类似于拓展部分,比如友元函数,初始化列表等,让大家对C++类与对象有一个更深层次的理解。通过这三节的讲解,大家要知道,类就是对某一类实体对象来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。通过理解类与对象的概念,我们可以更好地应用面向对象的设计思想来解决实际问题,提高代码的质量和效率。

2024-05-03 16:35:34 940 9

原创 类与对象(中)

当一个类什么都不写的时候,我们通常叫它空类,那么空类中真的什么都没有吗?事实上,任何一个类在什么都没写的时候,都会生成六个默认成员函数,分别为构造函数,析构函数,拷贝构造函数,赋值重载函数,以及普通对象与const对象取地址函数。由于大多数后两个函数不需要我们手动操作,所以今天主要讲解的内容是前面四个函数。为了方便,我们会以Date类为例子,更加方便让大家理解。理解构造函数,析构函数,拷贝构造函数,赋值重载函数对理解C++雷雨对象有十分重要的作用。2.1、函数名必须要与类名一致。2.2、无返回值。

2024-04-24 00:37:53 1112 13

原创 C++:类与对象(上)

class是我们定义类所使用的关键字,使用方法跟定义结构体类似,我们可以在类的主体部分定义成员变量与成员函数。类通常有两种定义方式,第一种就是声明与定义全部放在类体中,但需要注意的是,如果函数是在类里面定义的,编译器可能默认会将函数处理成内联函数。第二种方法就是类声明放在.h头文件中,定义放在.cpp源文件上,一般来说,除非迫不得已,我们更推荐使用第二种定义方式。但需要注意的是,由于类域的限制,我们在.cpp文件中写定义的时候,要在函数名前加上类名::这一点就跟C语言模拟实现栈,队列等数据结构一样。

2024-04-19 19:51:08 836 6

原创 常见排序宝典:帮助快速上手常见基础排序算法(下)

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即显示每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

2024-04-10 23:38:08 1052 9

原创 常见排序宝典:帮助快速上手常见基础排序算法(上)

希尔排序是对直接插入排序的优化当gap值>1时都是预排序,目的是为了让数组更加接近有序。当gap==1时,数组已经接近有序,这样就会很快。希尔排序的时间复杂度不好计算,并不固定。

2024-04-07 16:09:10 622 4

原创 震惊:引用与内联函数居然携手迈入c++

当涉及到优化C++代码时,内联函数和引用是两个重要的概念。内联函数可以减少函数调用的开销, 而引用可以提高代码的可读性和效率。在本文中,我们将深入探讨C++中内联函数和引用的知识点。

2024-04-05 00:15:21 310 2

原创 命名空间:组织代码的利器

在大型项目的代码分工工作中,通常会出现不同的人自己定义了相同名字的函数,参数等。就可能出现名字冲突或者命名污染等问题。为了避免这些问题的出现吗,我们就引出了“namespace”,命名空间这一概念。使用命名空间的目的是为了对标识符的的名称进行本地化,防止命名冲突,提高代码的可读性与可维护性。通过命名空间,我们可以将代码模块化,使得代码结构更清晰。在c语言中当我们定义一个全局变量rand,就会与stdlib.h库中的rand函数冲突。于是我们就在c++中引入了命名空间的概念。

2024-03-30 17:46:28 470 1

原创 走进c语言动态内存管理,拨开她的神秘面纱

总的来说,熟练的使用动态内存管理可以方便我们写出更好的,更灵活的代码,弥补函数中临时变量出了作用域就会被销毁的缺点。

2024-02-23 17:22:43 614 2

原创 c语言自定义类型:结构体的前世今生

在c语言中,结构体(struct)是一种用户自定义的数据类型,允许将不同类型的组合在一起,以便作为一个单独的数据单元来使用。结构体可以包含多个不同数据类型的成员变量,这是他们能表示更为复杂的数据结构。通俗的说,我们可以把结构体想象成一种生物,比如一种结构体就是人类,人类的性别,名字,国籍,年龄等标签,这些标签就是人类这个结构体不同类型的成员变量。人是一种结构体,那么植物,动物都可以算作是不同的结构体类型。有了结构体这种自定义的数据类型,我们才能更恰当且方便的让代码变得实用。

2024-02-22 17:20:39 1283 7

原创 c语言常见内存函数的使用与模拟实现

c语言提供了几个用于内存操作的函数,包括memcpy,memmove,memset,memcmp。这些函数可以高效且可靠的处理数据,本文将简单向大家介绍一下这些函数的使用,并简单模拟实现一下。

2023-12-27 23:43:39 953 1

原创 常见字符串函数的初步讲解(使用与简单模拟实现)

一、字符分类函数前言:在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数,现在接下来就简单讲解一下下面的字符串函数一、字符分类函数在C语言中,有一些常用的字符分类函数可以帮助我们对字符进行分类和判断。这些函数属于C标准库中的ctype.h头文件,并提供了对字符进行分类的功能。(使用以下函数时都需要包含ctype.h头文件)islower函数通过判断这里的c是否为小写字母而返回真值HeheHEHE。

2023-12-22 23:13:08 831

原创 c语言:从指针到指针数组

指针变量是为了储存内存地址的一个变量,在我们创建一个变量的时候,就会在内存中申请一块区域,这块区域就是这个变量的地址。由于这个四个地址的序号都是连着一块的,当我们知道第一个字节的地址时,就可以顺便地推出另外三个字节的地址。所以为了方便,指针指向a时,实际上指向的是a的第一个字节。我们如何去取出一个元素的地址呢?这里就要介绍一个操作符了:&,取地址操作符。这样就会打印出a所占四个字节的第一个字节的地址,比如:0x006FFD70,我们一般使用一个指针变量来接收 ,

2023-12-18 11:34:38 1178

原创 assert断言使用的必要性

这主要是为了防止野指针的危害,我们都知道,野指针具有极大危害性,为了让程序安全的运行下去,我们就需要再对指针的引用与结束时使用assert判断该指针是否已经变成了野指针。另外,assert也可以用在其他判断方面,在我们运行一个极其复杂的代码时,其中一些重要数据就需要通过assert来判断是否符合预期的值,方便程序成功的运行下去。,程序就会去验证p是否等于NULL,如果确实不等于NULL,程序就会继续运⾏,否则就会终⽌运行,并且给出报错信息提示。,用于在运行时确保程序符合指定条件,如果不符合,就报。

2023-11-22 19:04:21 98 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除