- 博客(37)
- 收藏
- 关注
原创 C语言:再探C语言指针
进行复习与补充在上期我们从指针的基础概念出发,再到对常见指针类型的讲解,相比大家对与指针的理解应该不成问题。这期博客主要就是对:函数指针应用()、函数指针数组的应用()、等进行深入讲解。
2024-07-22 14:31:32
939
1
原创 C++:类与对象——第一期
好消息,在C++中,结构体进一步升级成为了类C++兼容C语言中结构体的用法类不但可以包含多个成员变量,而且可以包含成员函数(函数的声明与定义)。成员变量又叫做类的属性,成员函数又叫做类的方法在类中定义与声明合并的函数方法,默认是内联函数。创建对象的时候,只需要类名即可,不用再加上类的关键字声明类的关键字又引入一个:class(类、类型)class与struct声明类的使用,除了默认访问限定符不一样,其余的一致。
2024-07-22 05:30:00
851
10
原创 C++:从C到C++的飞跃之旅(C++基础知识)
我们都知道,C++是C语言的前身,C++里面的很多语法,都来自于C语言,C++的语法是完全兼容于C语言的。可是,又有一个疑问?有什么问题是非C++不可的呢?下面,我们将以不破不立的原则,进而铺垫C++的基础知识,并展开讲解。namespace的本质,在用途方面,可以类似于电脑分盘(新建文件夹),在不同的盘符(文件夹)中可以定义相同的文件标识;不同的域可以使用相同的标识符,如局部域和作用域,都可以定义变量a;在同一域中,不能出现两个或两个以上的相同的标识符。
2024-07-12 14:22:17
1163
15
原创 二叉树第二期:堆的实现与应用
堆的定义:堆是一颗完全二叉树,且所有的父亲结点与子结点有相同的大小关系。大堆:所有的父亲结点的值 都比 子结点要大。小堆:所有的父亲结点的值 都比 子结点要小。上期,我们讲过,对于完全二叉树,若用数组的下标0,1,2...,从左到右依次表示第一层,第二层...,则父亲结点与子结点的关系,可用下标表示出来。而堆本身就是一种特殊的完全二叉树,所以用顺序结构表示堆,再简单不过~
2024-06-30 15:00:19
982
11
原创 二叉树第一期:树与二叉树的概念
与线性表不同,树是一种非线性的数据结构,由N(N>=0)个结点组成的具有层次关系的集合;因其形状类似生活中一颗倒挂着的树,故将其数据结构称为树。在树的定义基础上,树的度最大不超过2的(每个结点的度最大不超过2的),即为二叉树。注:二叉树有左孩子右孩子之分。
2024-06-24 10:56:19
1174
12
原创 【C语言/数据结构】队列:从概念到队列的实现
队列是一种特殊的线性表,只允许在一端插入数据,在另一端删除数据;插入数据的一端叫做队尾,插入数据的一端叫做队头;其有着先进先出的准则,FIFO(First In First Out)。
2024-05-16 15:55:49
568
20
原创 【数据结构】栈:从概念到两种存储结构的实现
避免了链表删除数据结点的时候,需要找到该结点的前一个结点;没有扩容所带来的空间的浪费与性能的消耗。栈的压栈操作,即为顺序表的尾插。栈的弹栈操作,即为顺序表的尾删。栈的压栈操作,即为链表的头插。栈的弹栈操作,即为链表的头删。缓存利用率不如顺序表高。
2024-05-13 22:57:11
715
17
原创 探索数据结构:链表的应用(带环链表的问题解决)
a.证明:慢指针走一步,快指针走两步一定可以?b.证明:快指针走三步、四步、....可行吗?
2024-05-01 22:47:23
382
18
原创 【C语言】贪吃蛇详解(附源码)
win32 API 的函数接口使用需要引头文件system() 库函数的使用需要引用头文件打印宽字符,必须事先本地化;你得保证自己的一切操作是windows控制台上执行的,而不是终端上面,修改方法,上边的横栏右键,点击设置,将windows终端,改为windows控制台即可~
2024-04-25 19:01:08
5045
18
原创 【C语言】翻译环境与运行环境
在我们学习C语言的时候,第一个接触的程序就是:在屏幕上打印” hello word!“,可当时的我们却未去深入的理解与感悟,一个程序代码是如何运行的;而这一期的博客,则是带着我们,通过C代码去理解源文件是如何生成可执行程序。首先我们得总体的知道,源文件经过编译+链接生成可执行程序;编译的目的是编译器将所有的源文件,生成一个目标文件(windows中扩展名为.obj,Linux中扩展名是.o),目的是将C代码转换为计算机可识别的指令;
2024-04-04 17:27:14
493
9
原创 【Linux】《Linux入门指南——上》建议收藏~~
在我们刚学习Linux的时候,常常会因为Linux环境的配置;或一些指令为什么别人能运行,我的Linux上就连指令都找不到?——有时候我们会玻璃心,心想:会不会我们Linux哪里下错了?又或者会因为指令及其所带的选项太多,导致自己陷入大脑的崩溃?当我们有问题的时候,想在CSDN上找到疑问的解答,可是要么是一些蹭访问量的水文,要么是那些比较综合性的博客,不能对你的问题做到一针见血(其实认真看完,你的收获定是水涨船高的,但是我们是初学者啊,定然无法快捷的辨析到自己所需要的答案)
2024-03-24 21:01:49
385
9
原创 【C语言】结构体与位段
我们之前学习过定义一个整型类型的变量又或者定义一个浮点型类型的变量...,这些变量可以描述一个整数又或者描述一个小数...,可无论是整数还是小数...,它们也只是简单对象。如果我们想要描述像一本书,一个人这种复杂对象,用我们之前学习过的类型去描述是完全不够的。一本书包含着很多信息,如书名、价钱、作者、出版时期...。我们会发现书的其中一个信息的表示我们是学过的,我们也能将其描述出来,如书名啊,作者啊,可以用字符数组,价钱啊,可以用整型...。
2024-03-24 13:02:07
1087
9
原创 【C语言】数据在内存中的存储(包含大小端字节序问题)~
我们在刚开始学习C语言的时候,就接触到了很多数据的不同类型。我们也知道,数据是存储在一块内存空间的,且我们只知道数据的类型决定着,该数据在内存中所占内存空间的大小,且超过一个字节的数据在内存中存储的时候,就有(以字节为单位)存储顺序的问题。可我们更应该知道,数据不仅仅只是存储到指定的空间就完事了,而是不同类型的数据有它相对应的存储原则的。这篇文章就是讲解不同类型的数据是在内容中的存储方式+大小端字节序。(本篇文章只对整型家族与浮点型家族对其在内存中的布局进行详解)待更~
2024-03-19 19:00:00
973
3
原创 【C语言】内存函数~
上期我们讲解了与字符相关的函数:其中就有strcmp()字符串比较函数;strcpy()字符串拷贝函数;他们都能对内存进行一定的操作,可是却无法处理一些非字符串的数据。而这里我将介绍这四个函数:分别是memcpy();memmove();memset();memcmp()。
2024-03-18 05:00:00
1807
5
原创 【C语言】整型提升与算术转换
所以,表达式中各种⻓度可能⼩于int⻓度的整型值,都必须先转换为int或unsigned int,然后才能送⼊CPU去执⾏运算。表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。整型算术运算的时候,像char类型,short类型,反正就是类型所占字节的大小小于int类型的,通常会先转换为int类型,进行运算。有符号的整数根据变量的数据类型的符号位数字来提升(如负数整型,高位补1,正数类型,高位补0);
2024-03-16 21:15:31
431
9
原创 【C语言】字符(串)函数详解~
这一期的博客,将会着重讲解常见的字符或字符串的相关库函数。C语言中有一组库函数专门用来处理字符类型的数据的,后文则会介绍字符分类函数以及字符转换函数。字符串相关的函数是本篇博客的重点,这也是为什么标题是字符串函数详解。我们不但会学习这些库函数的使用,而且对一些重要的库函数进行模拟实现,以学习他的算法思想也是重中之重,这对我们日后的C语言的学习的提升有着很大的帮助。字符函数的头文件:字符串函数的头文件:
2024-03-16 14:51:59
923
12
原创 C语言:从基础到精通指针
初始指针(0):着重于讲解指针的概念、基本用法、注意事项、以及最后如何规范使用指针深入指针(1):讲解指针变量常见的类型,如何去理解这些类型、最后就是如何正确的使用深入指针(2):讲解指针较为高阶的用法,理解难度 中度深入指针(3):在(2)的基础上,再讲解其余指针类型的高级用法,理解难度 偏难深入指针(4):指针相关的题目、及答案。理解难度 中度。
2024-03-09 17:39:49
870
18
原创 快速排序【全方面讲解快排,此文足以彻底扫盲】
本博客将会通过快速排序的思想,用C语言行代码实现(递归,非递归,挖坑法,前后指针法,以及快慢指针都是需要掌握的重点最后在推算出时间复杂度,分析快排的优缺点,以及说明其稳定性。废话不多说,正文开始。经过对快排思想的深刻理解,我们就知道找key的正确位置pivot,则成为快排是否能实现的关键,而找pivot,则有三种方法(挖坑法,前后指针法,以及快慢指针而分治思想的的实践,有两种方法(递归,非递归下面所有代码的实现,都是以升序为目的。
2024-02-12 00:34:39
811
2
原创 函数栈帧的创建与销毁【此一篇,足以让卿彻底扫盲】
在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈(First In Last Out, FIFO)。指令1,指令2:mov,push,将b的值给eax,将eax的值压栈,改变esp的位置,指令3:指令4:mov,push,将a的值给ecx,将exc的值压栈,改变esp的位置。指令2,3,4:将a,b的值给eax寄存器,完成整数的减法,并将exa的值赋给z;
2024-01-24 20:48:49
1291
6
原创 扫雷游戏【可展开一片,超详细,保姆级别,此一篇足够】
要传ROW,与COL的原因很简单,在开始,我们就说了我们只是为了方便处理棋盘边界坐标返回雷区的个数而行 列都+2,实际上真正要操作的还是未加之前的9x9的棋盘规模。在介绍扫雷游戏的规则制定的时候,提到过:计算周围的坐标雷的个数,可是若我们想要9x9的棋盘规格,就只定义9x9的二维数组。在玩家玩扫雷的时候,它会给你一个二维的棋盘(下面的讲解都以9x9规格为例子),然后点击你想排查的坐标,若不是雷的,则显示周围雷的个数。产生的雷的坐标是随机的,产生的雷的坐标不能重复,产生的雷不能超过我们布置的棋盘规格。
2024-01-16 18:33:04
1370
2
原创 C 语言每日一题——旋转数组的最小数字
我们如果对它进行排序的话,那最快的排序的时间复杂度至少是O(nlogn),显然我们要先排序是不可行的。根据对上图的理解:我们就可以知道,这题中的二分法,与之前用的二分法,差别就在于判断条件。且该数组的最小值一定在数组的前一个字数组升序边界;那有人会问,若下标mid所指向的值 = 下标right所指向的值,该怎么办?会想到之前我们经常打招呼的二分查找法,其时间复杂度符合O(logn);2.该数组的最后一个元素很大概率不属于我们要找的元素;但是二分查找的前提是:需要数组的有序的;
2024-01-12 15:20:17
1062
3
原创 分支语句[归纳]
如图是 if 语句最简单的逻辑应用,下面代码展示注:if后面若仅跟一条语句,则后面的 {} 可加可不加,有 {} 的意思是,语句块,你若if里面的条件表达式成立,你必须把我这整个语句块的代码,都执行完,所以:若后面有多条要执行的语句,你不加 {} ,则默认第一条语句,受if语句控制;在C语言中,除了 if 语句,可以表达分支以外,C语言也提供了switch语句来表达分支。若要表示多分支的逻辑,用多个case即可完成。
2024-01-10 23:41:12
390
原创 数据结构线性表之顺序表
为了方便你们对顺序表进行验证,和更深刻的理解,我会将所有的代码放在一起,你们可通过此链接或者完整的源代码;顺序表——源代码 · ee3e47b · 残风也想永存/C语言项目 - Gitee.com。
2024-01-08 18:10:19
789
原创 如何写出随机数的代码?【超详,一键扫盲区】
在调用rand函数前,先调用srand函数,通过srand函数的参数,来调整rand函数产生随机数所依赖的基准值,只要种子是变化的,rand函数每次产生的随机数序列也就变化了起来。是因为rand函数是依靠基准值种子进行运算产生的随机数,所以我们要产生真的意义上的随机数,就得让这个种子是变化的。用来产生一个伪随机数,其范围是0~RAND_MAX ,具体的最大值,是依靠翻译器实现,我用的VS编译器,其值是32767。看种子设值为1的时候,和前面的两张图的五次的打印值是一样的。作用:用来初始化随机数生成器。
2023-12-31 16:52:33
751
2
原创 C语言每日一题——打印素数
若a为素数,则b/c只能为1,c/b只能为a;这样我们只需要保证,2~sqrt(a)没有可被a整除的除数就可以判断a是素数,这样就可以省去一半的循环。3.对于一个数,假定它是素数,创建一个变量flag,并初始化为1,若不符合要求将flag赋值为1;2.假定一个数字 i ,若想判断 i 不是素数,则需保证2~(i-1),的除数,不能被 i 整除,也就是没有余数。1.这里要用到两层嵌套循环(外层:循环这100个数字,内层:判断这100个数字是否是素数,符合数字要求打印出来)素数的能被1和它本身整除的数;
2023-12-29 10:38:20
515
2
原创 printf(scanf)【详解归纳】
头文件为intscanf(constcharformatargument...intprintf(constcharformatargument...在我们写代码的时候,以及刷oj的题的时候,会经常用到printf函数(从内存中打印信息到屏幕外),以及scanf函数(从键盘在输入信息到内存),那你有没有对这两则函数有更深刻的认识?下面将介绍它们的所以的“个性”。3.1 %c。
2023-12-23 14:43:22
1002
1
原创 通讯录的实现(优化)【动态开辟+文件管理】
除了要讲解如何进行扩容处理外,需强调下易错的地方,不要看我函数里面的参数也设置的con,此con与外面的那个con,不一样,函数里面的con是外面那个con的临时拷贝。这里我们既然运用到了柔性数组的知识,则得谨记用sizeof对结构体类型进行大小测量,是不包括柔性数组的大小的,所有这里的sizeof(contact)的值为8,我们若想达到我们想要开辟联系人大小大空间,则必须超出这个值,这里我为了方便实现通讯录的各个功能,仅仅多开辟了3个联系人大小的空间:3*sizeof(people);
2023-12-13 21:52:24
1045
2
原创 文件管理【详解归纳】
二进制文件与文本文件:根据数据的存储形式,可以分为二进制文件,与文本文件,不经过转化,直接输入到外存的文件,称为二进制文件,计算机语言,一般是看不懂的,而文本文件,数据经过ASCII转化,存储到文件中,是人们所能读得懂的。这里,我们将庄梦涵.txt文档里的数据读取到变量lyy中,可能你们又要问,为什么我们不直接在同一个程序进行读和写呢,这里涉及了一个文件缓冲区的问题,如果你直接把if语句里的三条语句都运行,则程序会出错。而文件的存在则很好的解决了这一问题,我们写的数据可以存储在文件中,进行持久化的保存,
2023-12-12 00:13:39
1139
2
原创 柔性数组【详解】
两者区别就是,用柔性数组开辟的动态空间,在堆区上是连续的。而利用指针开辟的动态空间,与另外几个成员名,是不连续的。就算结构体变量也在堆区上开辟,那由malloc的脾气,在堆区任意开辟一片足够的空间,你用malloc开辟两次空间,那肯定不连续。其三,用malloc()动态开辟超出结构体类型大小的内存空间,以满足数组预期的的大小,C99规定,在一个结构体类型中,最后一个成员类型名是未定大小的数组,则为柔性数组。其一,不占据sizeof()返回结构体类型的大小的内存,其二,柔性数组前面至少包含一个元素,
2023-12-09 12:34:00
452
原创 动态内存管理
在C语言中,我们创建数组的时候,要么对齐进行初始化,要么表明数组的大小,且数组的大小表明的时候,只能用常量(虽然C99标准中允许了这种行为,但是没有流行起来,这样写在VS上面是错误的。在使用的时候,为了培养我们良好的代码风格,故需要用一个if语句,来判断是否申请空间失败,而返回的空指针,一般我们会用上strerror函数,与errno的宏定义,这样会打印出我们错在哪里。在讲述free函数的时候,就已告知,free函数是专门用来释放动态开辟的内存空间,你若对非动态开辟的空间进行释放,其行为是未可知的。
2023-12-07 22:50:07
1288
1
原创 通讯录项目的实现
初始化也是挺简单的,只需要运用一个memset函数,简单对memset注释一下吧,memset的第一个形参值的是你要操作的变量,第二形参是,你要初始化的值,注意这里初始化的值,是按每个字节初始化的,第三个是你要初始化的字符数,也就是字节数。我也把有关次,模拟的讲解链接,放在这。通讯录是保存联系人信息的功能,想想咱们手机上的通讯人,每一个联系人都会有(姓名,性别,年龄,手机号,住址等信息栏),故联系人是一个复杂的对象,那咱们就可以创建 一个结构体。这里,没什么要着重说明的,记得size的值--都行。
2023-12-02 14:24:25
1219
原创 冒泡排序进阶之模拟qsort排序函数(回调函数用法讲解)
qsort函数可对任意的类型(包括整型,浮点型,结构体等),按照你想要的排序原则进行排序,我之前有一篇博客,对其四个参数,以及用法,进行了详细的讲解,可以由下面链接跳转此博客,进行查看(这里我要重新提及一下它的第三个参数,宽度-也就是数组中每个元素的大小。在qsort函数,要排序的数组的接收参数的类型是void*,以及接受的排序原则的函数也是void*
2023-11-28 00:14:45
522
5
原创 排序神器——qsort函数之详解
首先qsort是一种全能的排序函数,可排整型,浮点型,结构体,以及根据你想要的排序原则进行排序(这次其实利用了一个非常重要的一种函数),其算法是快速排序,是对冒泡排序的一种改进。头文件是:先看此函数是如何定义的:voidqsort(voidbasesize_tnumsize_twidthint(__cdeclcompare)(constvoidelem1constvoidelem2。
2023-11-24 20:04:12
657
原创 C语言每日一题——给学生安排连续座位
姐姐告诉我scanf会读取一个回车,(我才知道,上一次输入打入的空格是‘\n’,且上一个scanf读取字符时,在‘\n’停止,这次scanf去读取时,直接去读取‘\n’,于是我少了一次循环机会。我字符去数,刚好有5个回车,我也就少输入5次, )并推荐我输入字符串(%s)去试试。我去问善良的,姐姐,我本想循环输入3*3 = 9次的字符,存入二维数组中,为何我就输入了4次?后来才发现,当所需要的连续空座位K为1的时候,ans重复加了两次,所以当k=1时,结果要/2.我不断的尝试,并输入值,答案也对啊?
2023-11-15 21:26:30
361
原创 设计函数模拟strlen函数实现字符串长度计算的三种方法
又知道数组在内存中存储的地址是连续的,所以每次++,指针代表下一个字符的地址,当指针指向'\0'时,结束循环。一、strlen函数本身是计算字符串长度的大小,返回值是无符号的整型,而结束的标志是'\0',测量的是'\0'之前字符的个数,清楚strlen的主要特征,接下来开始模拟实现。递归的终止条件也是‘/0’,递归过程如下,是不是有点大事化小的感觉?,这里递归了8次,去掉\0,结果是7。s指针,指向字符串第一个字符,p指针指向字符串最后一个字符,则指针相减,得到的就是,这俩指针之间的字符个数。
2023-11-11 22:22:43
288
1
原创 第一篇博客
我目前编程的短期学习目标是,能熟练掌握C语言,以及数据结构,以至在之后在C++或java之间择选一个语言,继续深入学习,为能在大二参加一场ACM/蓝桥杯,以满足自己,阔大自己的视野,以丰富自己。我作为一个初学者,对此充满着新鲜感,每天都有非常旺盛的精力,现阶段来说我愿每天花费5个小时的时间去学习。我相信我会越来越执迷于编程学习,本人大一新生,我对编程充满前所未有的兴趣,愿自主掏出非常高精力去学习这门专业。B站,相关计算机书籍,以及刷题网站:洛谷,牛客网,力扣,都是我的学习途径。
2023-11-02 08:50:31
108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人