
c++,c 编程语言
文章平均质量分 79
用不一样的方法去讲解各个知识点,让编程不再高高在上。让每个人都能·接受系统性的学习知识。提高代码素养和职业素养,底层思维。
chenyuhao2024
一直致力于分享知识,你的关注就是我最大的动力 何时葡萄先熟透,你要静候再静候
展开
-
一看就懂的动态内存管理2
好了承接上文,我们来讲。原创 2025-03-02 15:03:58 · 1041 阅读 · 0 评论 -
一看就懂的动态内存管理1
这时候就只能试试动态内存开辟了。什么意思呢,就是我们系统开辟内存的时候分为三个区域,一个是栈区一个是堆区,而我们的动态内存就是在堆区上开辟的,包括图里面的四个动态内存函数也都是在堆区上用的。malloc 是 "memory allocation" 的缩写,用于在堆上分配指定大小的内存块,并返回指向该内存块的指针。好这篇文章我们就来看看动态内存的管理,这篇文章的知识就涉及到栈帧的的创建和数据结构方面的知识了,换句话说,也是在。如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。原创 2025-03-02 14:13:52 · 372 阅读 · 0 评论 -
看完就进阶的结构体完结篇4枚举和联合
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。//联合类型的声明union Unchar c;int i;//联合变量的定义//计算连个变量的大小。原创 2025-03-01 19:53:25 · 695 阅读 · 0 评论 -
那些不为人知的文件操作知识2
朋友们,承接上文。我上篇文章发布出去的时候想到缓冲区的内容忘记讲了,不过没关系,放在这一篇文章里面更加能体现内存空间的变化。缓冲文件系统文件缓冲区文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。具体的方式如下,这个就像我们在使用printf的时候所标注的%d这种是一样的意义。这个代码比较简单,不做过多解释,可以放在ai里面自己去尝试理解,主要要理解这个逻辑。上面是c++的网站,这里解释一下什么是输入输出流。原创 2025-03-07 22:13:50 · 970 阅读 · 0 评论 -
那些不为人知的文件操作知识1
好了朋友们,这将是我们在c语言知识的最后一节课,正如题目所言,关于文件的各种知识,你可能或多或少的听过,但一定没有系统性的学习过,比如文件的后缀.c文件和txt文件为什么是这样,好,今天这篇文章我们就来深入的讲解。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。这里我们讨论的是数据文件。原创 2025-03-07 21:17:49 · 1083 阅读 · 0 评论 -
非常重要的动态内存错误和柔性数组2
在 free(str) 之后,str 指向的内存已经被释放,但后续代码仍然尝试使用 str(如 strcpy 和 printf),这会导致未定义行为。这里很明显就能看到,这里引用的函数名是不匹配的。然后这里printf的打印是不标准的,有些编译器可能会让你通过,当然有些就已经报错了,程序不稳定,有安全风险。但是被static修饰的变量存放在数据段(静态区),数据段的特点是在上面创建的变量,直到程序结束才销毁。实际上普通的局部变量是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁。原创 2025-03-06 20:00:36 · 1113 阅读 · 0 评论 -
非常重要的动态内存错误和柔性数组1
因此,GetMemory 返回的指针指向一个无效的内存区域,导致 Test 函数中的 printf 操作会引发未定义行为(表现通常是打印乱码或程序崩溃)。承接上次的动态内存的分享,我想想还是把具体的易错点分享一下,再跟大家分享四道非常经典的笔试题,以后找工作会发现,很多题就是这四道题的原型。这个后面两篇文章会讲。在 Test 函数中,str 被初始化为 NULL,但通过 GetMemory 赋值后,它指向了一个无效的内存地址。程序分配了内存但没有释放,导致内存被持续占用,最终可能导致系统内存耗尽。原创 2025-03-06 19:34:08 · 652 阅读 · 0 评论 -
看完就进阶的结构体完结篇3位段
承接上文,讲完了结构体我们就得来讲讲位段。位段(Bit Field)已经涉及是C/C++语言中的一种数据结构,它允许你在结构体或联合体中定义特定宽度的字段。位段的主要用途是节省内存空间,特别是在嵌入式系统或对内存使用有严格限制的应用中。什么是位段位段的声明和结构是类似的,有两个不同:1.位段的成员必须是 int、unsigned int 或signed int。2.位段的成员名后边有一个冒号和一个数字。在这里A就是一个位段类型那位段A的大小是多少?怎么计算呢?原创 2025-03-01 19:19:43 · 1109 阅读 · 0 评论 -
看完就进阶的自定义2
有了结构体类型,那如何定义变量,其实很简单int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2可以直接在花括号后面跟定义,也可以单独定义。那初始化呢?//初始化:定义变量的同时赋初值。struct Stu //类型声明//名字int age;//年龄//初始化直接赋值初始化。或者嵌套初始化int data;//结构体嵌套初始化//结构体嵌套初始化结构体内存对齐我们已经掌握了结构体的基本使用了。现在我们深入讨论一个问题:计算结构体的大小。原创 2025-02-26 20:06:46 · 486 阅读 · 0 评论 -
自定义类型看完这篇就进阶1
这篇文章我们来讲讲所谓的自定义类型。自定义类型:结构体,枚举,联合首先我们先来看结构体。可以说,结构体这块知识你学通透了,后面的枚举和联合将不攻自破了。原创 2025-02-26 19:29:02 · 838 阅读 · 0 评论 -
字符函数和字符串函数3完结篇
上一篇文章讲了长度受限制的字符串函数介绍strncpystrncatstrncmp以及字符串查找的两个函数strstrstrtok今天这篇这个文章就是这个系列的完结了,接下去的是动态内存管理和结构体的内容,后面就转到用c语言的初阶数据结构了。原创 2025-02-22 14:53:10 · 1044 阅读 · 0 评论 -
字符函数和字符串函数1
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组里字符串常量适用于那些对它不做修改的字符串函数.原创 2025-02-21 12:28:47 · 793 阅读 · 0 评论 -
函数看完这篇就登峰造极第四部分,迭代
首先,在这里放一个递归的自定义函数,这里解释一下,谁的阶乘就是,从1一直加一到你这个数的所有数的乘积。那么也就意味着你这个数一定是多变的,如果你的n取到了很大的数,那很麻烦。等于第三项就单独拎出来算了两遍,但是以此类推,如果这个n很大的时候,比如50,就会具有一个特别大的计算量,程序运行的时间就会变得很长。这里给大家贴一个代码,大家直接复制粘贴去运行一下就会发现,这是千万级的计算量,就50为例的时候,但是50肯定不能满足我们,这就说明这个代码的效率实在是太低了。这就涉及到了函数栈帧的创建了,这里是栈溢出。原创 2025-01-15 22:11:06 · 586 阅读 · 0 评论 -
函数看完这篇就登峰造极第三部分 3/4
噢,这样一想还真的是,我在输入的时候已经不能用int了,得用什么呢?再者,打印他的每一位,数位分离这是我们的基本功,但是我们所得到的数据是4321,如果简单的把这些数据存储起来再逆序输出,可又会涉及到这个数的位数问题是未知的,不好搞定。但是常规的想法就是按位输出,如何再拿到4321,最后1234就可以了,按位输出可以用一个for循环加while循环去实现,当数/10=0的时候为假就可以了,然后灵光一现,我可以用一维数组去存储这些数字啊,最后按照下标逆序输出不就好了。,那具体是什么意思呢,用一个代码讲透。原创 2025-01-13 21:21:31 · 259 阅读 · 0 评论 -
函数看完这篇就登峰造极第二部分 必看
讲到这里再插一嘴,我们讲局部变量和全局变量哪个好,肯定是局部变量好,但是相对的难度更大,对于作用域要十分清晰,所以很多人写代码啪一下把全局变量写在那就过了,但是对于团队的项目呢,你的全局变量,一旦代码一改,或者名称有重复呢,当然更深层的还是函数栈帧模块,全局变量的空间的占用,简单一说,就是你的全局变量可能会占用空间从而影响到别人的代码。这里的.h代表的是我们编译器里面的头文件,.c文件则代表我们的源文件,也就是说当我们写好一个函数的时候,直接像代码中所显示的那样引用一下就好了。不然会出现临时卡壳的情况。原创 2025-01-13 18:13:08 · 595 阅读 · 0 评论 -
总结编程思想的引用与迁移的认知误区
我今天在学习指针的时候,了解到指针的解引用和二级指针,我不禁想到了一维数组和二维组,于是突发奇想下,能不能用一维数组去模拟二维数组的实现呢?利用四个一维数组就可以实现二维数组的转变,但是看到这里,读者朋友们一定会对我唏嘘不已,认为我浪费了你们的时间,但别担心,请接着看下去,保证我的感悟会对你有所帮助。而是迁移原因与程序设计中的底层思想,凡是设计程序必是由繁琐到简单,而所谓的二级指针那些也是在变得简单的时候设计出来的。我们在反复从一级到二级的过程中探究程序的可能,但是假如用参量,是不是就会更生搬硬套呢?原创 2024-08-30 18:36:02 · 366 阅读 · 0 评论 -
实用技巧续篇
这里对于新人不是很友好,但是没关系,你把前面一串的字符记成门牌号就行了,就像我们平常很容易就出现的访问越界的问题,如果我知道了你的地址,也知道了目的地的地址,是不是就知道往哪走了?这里确定调试开始以后,我们找到调试窗口里面的监视,就会出现图片里面的这个图片,在里面输入自己定义的名称,如何呢,然后继续按F10,逐步走下去,同时观察右边的数值的变化就可以了。这里可以看我们在使用的寄存器的具体信息,也就是之前提到的esp,ebp那些,大致有个了解就行。初学者可能80%的时间在写代码,20%的时间在调试。原创 2025-01-11 20:21:34 · 256 阅读 · 0 评论 -
函数重点看完这篇就登峰造极第一部分
在main函数中传给Swap1的num1, num2和传给Swap2函数的&num1,&num2是实际参数。所以我们的自定义函数,或者是cpp网站的函数后面的参数都用的是地址,这就是传址调用。类似于我们要改合同,改了复印件不改原件,但是实际上,具有法律效益的还得是我们的原件,复印件只是一种拷贝。原创 2025-01-12 22:09:41 · 513 阅读 · 0 评论 -
不一样的函数要点(从小白开始精通)
也就是说,我这就相当于九九乘法表,需要用到的时候能脱口而出,这样就可以避免我们去再一次次用小学老师教的方法去列竖式,但是弊端也很容易就显现了,如果给你一个9*9你马上就知道是81,但是我要是给你的9.1*9.1呢,(这里的例子可能不太恰当,因为标点是格外加上就好了)但是在编程里,我们要实现这样的乘法,单一的库函数肯定是不能兼容运行了,所以这个时候就要用自定义函数。这篇文章,我将讲解几个在日常使用中不容易注意到的要点,函数我们所要学习的远不止自定义函数,库函数,不单单就是为了解题,ok话不多说开始。原创 2025-01-12 21:36:37 · 313 阅读 · 0 评论 -
VS2022实用调试技巧(从小白开始学习)
总的来说,Debug的版本,更能让我们看到每一步计算机是怎么走的,所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。上图的ebp,esp等都是寄存器,所以Debug和Release本质上的区别就是开辟内存的顺序不一样所导致的程序执行的结果也不一样。这是人类历史上第一个错误,在当时,人们对于第一次出现的错误,从头开始算了很久,后面一想,要是以后又出现错误,每次都要一次次重推,这不是麻烦死了,于是就想,能不能设置观察运行的自检程序,减少推导呢,于是,调试,应运而生。原创 2025-01-11 19:48:40 · 390 阅读 · 0 评论