C语言
文章平均质量分 92
深入讲解C语言知识
秦少游在淮海
自由
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
VS小技巧:如何在一个项目中添加其他项目
在Visual Studio中,可以通过右击“解决方案”并选择“添加”->“现有项目”来将其他项目添加到当前解决方案中。例如,添加了“test_25_2_11”项目后,如果“test_25_5_5”项目仍为加粗字体,运行时将执行“test_25_5_5”项目中的代码。将关联性强的项目放在同一解决方案下,便于切换和管理,但需注意文件命名以避免混淆。要运行添加的项目“test_25_2_11”,可以通过右击该项目选择“生成”,或将其设为启动项目后按Ctrl+F5运行。原创 2025-05-09 19:09:47 · 599 阅读 · 0 评论 -
函数栈帧的创建与销毁
在写代码的过程中,你是否会有疑问,当你越界打印数据的时候,屏幕上会出现"烫烫烫烫……" 或者 “屯屯屯屯……” ,这是为什么呢?这是由于在Debug 模式的第四步中,会将所有分配出来的栈空间的每一个字节均初始化为0xCC,而 0xCCCC所对应的汉字编码便是"烫" ; 在堆区中,编译器会将分配出来的堆空间中的每一个字节初始化为 0xCD ,而0xCDCD所对应的汉字编码便是“屯” ;局部变量是怎么创建的?为什么局部变量的值为随机值?函数名可以表示函数的地址,函数如何调用的?其传参的过程又是怎样原创 2024-09-17 16:11:48 · 859 阅读 · 0 评论 -
通讯录 - 文件版本
想让数据做到持久化,又两种形式,一是文件,二是数据库;本篇博文便是以文件地形式让数据做到持久化;将数据写入文件的这步操作应该放在那个过程呢?显然,我们想要的效果是,当你退出该程序的时候,可以将数据写入文件中保存起来;当然,当我们保存文件之后,还希望当此通讯录程序再次运行起来的时候,程序可以从文件中读取先前保存的数据,我们仍然可以看到之前的信息;综上,我们需要增加两个功能;一是,当程序退出的时候,可以将该程序中已经存在的信息写入文件之中;二是,当程序再次运行起来的时候,可以加载文件中的信原创 2024-09-13 09:24:33 · 1723 阅读 · 0 评论 -
通讯录 - 动态内存开辟版本
在静态通讯录版本的基础上,动态版本的通讯录其内存根据数据的数量因而地制宜地开辟空间,为避免内存泄漏,不使用该程序时,自然要将此动态开辟地空间给释放掉;因地制宜地开辟空间便要采取三点:一是通讯录需要三个变量来维护,指向动态开辟空间的指针、记录通讯录中存了多少信息的变量以及当前通讯录的容量;二是,在每次存放数据的时候均要判断当前空间是否足够,不足便要进行扩容的操作;三是,当退出此程序的时候,要对动态开辟的空间进行释放;其他的步骤与静态版本的别无二致;原创 2024-09-11 18:40:58 · 1498 阅读 · 0 评论 -
通讯录-静态版本
此通讯录要存放得下人得信息,而人的信息又是怎么样的呢?人的信息,必然是包含人的姓名、年龄、性别、电话、地址等信息,自然此处用结构体变量来存放人的信息;通过观察生活中手机上通讯录功能,我们可以大致列下一下功能(增删查改):存放100个人的信息(此处为静态通讯录)可以增加联系人可删除指定联系人查找联系人修改指定联系人的信息对联系人的信息按照一定的依据进行排序显示联系人原创 2024-09-11 10:25:24 · 1589 阅读 · 0 评论 -
C语言 预处理详解(二) #命令行定义 #条件编译 #文件包含 #其他预处理指令
1、命令行定义:许多C的编译器提供了一种能力,允许命令行中定义符号,用于启动编译的过程;2、条件编译:在某些条件下的编译,即条件满足便去编译,条件不满足便不编译;3、常见的条件编译指令:1、条件编译#if 常量表达式 //……#endif//常量表达式由预处理器求值2、多个分支的条件编译#if 常量表达式 //……#elif //……#else //……#endif原创 2024-09-10 10:51:20 · 1122 阅读 · 0 评论 -
C语言 - 预处理详解(一)#预定义符号 ##define #undef
1、在C语言本身便预定义了一些符号,这些符号是可以直接使用的;__FILE__ //进行编译的源文件(文件名:路径+主干名+后缀) %s__LINE__ //文件当前的行号 %d__DATE__ //文件被编译的日期 %s__TIME__ //文件被编译的时间 %s__STDC__ //如果编译器遵循 ANSI C,其值为1,否则未定义 %d2、#define 定义的标识符语法: #define name stuff原创 2024-09-08 21:40:35 · 1686 阅读 · 0 评论 -
C语言-程序环境 #预处理 #编译 #汇编 #链接 #执行环境
预处理阶段主要处理的是那些源文件中# 开始的预编译指令;比如:#include #define ,处理#include 预编译指令,将包含的头文件的内容插入到该预编译指令的位置;这个过程是递归进行的,也就是说被包含的头文件也有可能会包含其他文件;将#define 定义的标识符常量给替换掉,并且删除所定义的符号;删除注释(PS: 注释是给程序员看的,这些注释对于程序本身来说没什么用,于是乎在预处理阶段便删除了)原创 2024-09-06 19:22:39 · 1260 阅读 · 0 评论 -
C语言 文件 #程序文件 #环境文件 #文件的打开与关闭 #流 #文件缓冲区 #文件的顺序读写 #文件的随机读写
流,FILE* 类型的指针便称为"流";针对文件、键盘、显示器(屏幕)、网络、U盘、软盘、光盘、打印机等外部设备上的数据的读写都是通过 '流'来进行的;当数据需要从输入流中读取到内存中时,可以将数据转移到缓冲区中进行暂存。 当数据需要从外存写入到输出流中时,可以先将数据存放在缓冲区,当缓冲区满了之后,再一次性写入到输出流。 这样可以避免频繁地打断操作系统;原创 2024-09-04 12:40:38 · 922 阅读 · 0 评论 -
C语言 动态内存管理 #动态内存函数的介绍 #常见的动态内存错误 #C\C++ 程序的内存开辟 #柔性数组
柔性数组的特点结构体中的柔性数组成员前面必须至少有一个其他成员;sizeof 返回的这种结构的大小不包括柔性数组所占的内存;包含柔性数组成员的结构体需要用malloc 对其进行动态内存的分配,并且所分配的内存应该大于结构体的大小以适应柔性数组的预期大小;原创 2024-08-29 21:35:44 · 1017 阅读 · 1 评论 -
c语言 自定义类型--枚举 、联合 #枚举类型的定义 #枚举的优点 #枚举的使用 #联合类型的定义 #联合的特点 #联合大小的计算
1、枚举的关键字 : enum ;在声明的时候,带上标签名、成员列表、变量列表(可省略),但是在成员列表之间与结构体不同的是,枚举的成员为带有值得字符无需带上类型,而结构体成员是需要带上变量类型的;且在枚举成员之间是用 , 隔开,最后一个成员不需要 , ,而结构体的每一个成员后面都需要带上 ;2、联合的关键字: union ;在声明的时候,需带上标签名、成员列表、变量列表(可省略),联合的成员之间和结构体成员之间一样用 ; 隔开;但是其成员在内存的分配上不同,联合的成员会共用内存空间,原创 2024-08-26 19:00:35 · 1389 阅读 · 0 评论 -
C语言 自定义类型-结构体 #结构体类型的声明 #结构体的自引用 #结构体内存对齐 #结构体位段的实现
1、第一个成员总是存放在结构体变量申请的空间偏移量为0的地址处;2、其他成员变量(除第一个成员变量以外的成员变量)要对齐到其对齐数的整数倍偏移量的地址处;对齐数的计算原则:对齐数 = 在该成员所占空间的大小 与 编译器默认对齐数中间取一个较小值;注:在VS编译器中,其默认对齐数为8(默认对齐数可进行修改,文章下面会讲述);可以说,只有在VS编译器上有默认对齐数的概念,而在其他编译器上,没有默认对齐数的概念,那么在其他编译器上,其对齐数就是该数据自身的大小;原创 2024-08-23 21:20:10 · 1646 阅读 · 0 评论 -
内存库函数的使用与其模拟实现 #memcpy #memmove #memcmp #menset
memcpy 内存拷贝--> C语言标准中明确说明memcpy 可以不考虑重叠拷贝memmove --> 可以实现重叠拷贝memcmp --> 将内存中的数据一个字节一个字节地比较memset --> 不用利用循环便可以批量改变内存中的数据原创 2024-08-13 16:15:30 · 1187 阅读 · 0 评论 -
常见 字符串库函数 的使用与模拟实现 #strlen #strcpy #strcat #strcmp#strstr #strtok #strncpy #strncat #strncmp
strstr --> 查找一个子字符串的函数(在一个字符串中找另外一个字符串的函数)strstr 的工作原理: 在 str1 所指向的字符串中查找str2 所指向的字符串;如果找到了,然后就返回在str1 中找到 str2 的起始位置;如果没有找到就返回空指针 NULL;原创 2024-08-10 15:58:26 · 1493 阅读 · 0 评论 -
C语言 #函数 #库函数 #自定义函数 #形参和实参 #嵌套调用和链式访问 #函数的声明和定义 #函数指针 #函数指针数组#函数递归 #回调函数 #库函数qsort #利用qsort 思想实现冒泡排序
回调函数是什么?回调函数就是通过函数指针调用的函数;如果你将一个函数的地址作为一个参数传给另外一个函数,当此指针被用来调用所指向的函数的时候,被调用的函数就是回调函数;回调函数不是由该函数的实现方直接调用,而是在特定的事件或者条件发生时由另外一方函数调用的,用于对此事件进行响应;原创 2024-08-02 11:43:57 · 1375 阅读 · 0 评论 -
C语言 #具有展开功能的排雷游戏
游戏思路:当玩家输入自己的选择后,要么退出游戏,要么进入排雷游戏;当玩家进入排雷游戏时,就要先给玩家展示一下棋盘,让玩家输入想要排查的坐标,计算机再判断玩家输入的这个坐标是不是'雷',如果是雷,游戏结束;当然菜单会再出现一次,玩家可自行判断要不要再来一局游戏;如果不是雷就要向玩家展示此坐标周围雷的个数,并且玩家会一直输入坐标进行排雷直到玩家踩到雷或者玩家排雷成功;原创 2024-07-28 20:43:48 · 1429 阅读 · 0 评论 -
C语言 #指针数组 #数组指针 #数组参数、指针参数
1、指针数组是一个存放指针的数组。2、想要访问指针数组中存放的数组名中的元素便有两种方式,一是通过数组的下标进行访问;二是利用地址的方式进行访问;3、数组名通常表示的都是其首元素的地址;但是有两个例外:1、sizeof(数组名) ,这里的数组名表示整个数组,所以计算的是整个数组的大小2、&数组名,这里的数组名表示的依然是整个数组,所以 &数组名 取出的是整个数组的地址;4、数组指针的初始化:想要存放数组的地址,指针变量类型中的[ ]里必须要标明数组的元素个数5、[ ] 的优先级高于*原创 2024-07-25 11:00:09 · 2737 阅读 · 2 评论 -
C语言 #字符指针
以例子为导向来分析字符指针的中存的是什么,以及常量字符串在内存中是如何存储的。1、字符指针就是指针变量指向的对象是字符类型,即指针变量的类型为 char*;2、指针p中存放的是常量字符串在常量区存放的首字符 'a' 的地址3、常量字符串存放在内存中的常量区,常量区中的数据只能读取而不能被修改。原创 2024-07-20 11:46:31 · 3046 阅读 · 1 评论 -
C语言 数据存储之结构类型 万字讲解#数据类型详细介绍 #整型在内存中的存储 #大小端字节序 #浮点型在内存的存储解析
万字讲解在前面我们已经学过很多的内置类型:char //字符数据类型 1 byteshort //短整型数据 2 byteint //整型 4 bytelong //长整型4byte (32位 )\ 8 byte (64位)long long //更长的整型 8 bytefloat //单精度浮点数 4 bytedouble //双精度浮点数 8 byte。原创 2024-07-19 10:31:27 · 1334 阅读 · 1 评论 -
C语言 调试 #什么是bug,调试 #Debug 与 Release版本的区别 #VS调试快捷键 #模拟实现strcpy ,strlen #编程常见错误
大家多多亲自尝试调试,故而这里部分内容讲得很略;Debug 通常称为调试版本:它包含调试信息,并且不做任何优化,以便于程序员调试程序;程序员在写代码的时候,需要经常性地调试代码,就在此处设置为Debug版本,这样在编译的过程中产生的是Debug版本的可执行程序,其中包含调试信息,是可以直接进行调试的;Release 称为发布版本:它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户更好地使用。当程序员写完代码,测试再对代码进行测试(测试测试的是release版本),直到程序的质量交原创 2024-07-16 18:51:10 · 1254 阅读 · 0 评论 -
C语言 底层逻辑详细阐述结构体 #结构体的声明 #结构体的初始化 #结构体成员访问 #结构体传参
基于自我理解的角度来讲结构体;1、结构是一些值的集合,这些值称为成员变量;结构的每个成员可以是不同类型的变量;2、结构体类型的声明通常是在main函数外进行的;当然也可以在主函数内部进行声明,只不过此时的结构体类型就为局部变量,只能在main 函数的内部使用;此处并不是全局变量与局部变量,请注意。3、在结构体变量创建时再给它一个初始值就是结构体变量的初始化;在创建结构体变量赋值时,至少为一个结构体成员赋值;故而分为完全初始化与不完全初始化;4、. 点操作符: 结构体变量 . 成员名。原创 2024-07-15 10:41:33 · 1239 阅读 · 0 评论 -
C语言 底层逻辑详细阐述指针(一)万字讲解 #指针是什么? #指针和指针类型 #指针的解引用 #野指针 #指针的运算 #指针和数组 #二级指针 #指针数组
全文12000+在正式开始讲解指针之前,我们先来思考一下什么是内存。生活中,手机有内存、电脑也有内存……内存是电脑上重要的存储器,计算机中的CPU(中央处理器)在处理数据的时候,需要的数据是从内存中取得的。那么你可能就会有疑问,每个内存单元的编号也就是地址,是怎么产生的呢?地址产生的原理:依靠电脑硬件的电路产生;地址中总线通电便会产生电信号,而电信号分为正脉冲和负脉冲;即地址线通电便会产生1或者0;地址信息会下达给内存,在内存中便可以找到该地址对应的数据,将数据通过地址总线传入CPU寄存器。原创 2024-07-14 15:26:11 · 1691 阅读 · 0 评论 -
C语言 #赋值操作符 #复合操作符 #单目操作符 #关系操作符 #逻辑操作符 #条件操作符 #逗号表达式 #下标引用操作符 #函数调用操作符 #结构体成员
赋值可以是单个赋值,也可以是连续赋值注:连续赋值时,在调试的过程中是看不到值得变化过程,故而不太推荐只用连续赋值例1:int a = 1;//初始化:在创建变量的时候就给它一个初始值int b = 2;int c = 3;//连续赋值是从右向左进行解读;即 b = c + 3;a = b;1、赋值可以是单个赋值,也可以是连续赋值;连续赋值时,在调试的过程中是看不到值得变化过程,故而不太推荐只用连续赋值2、-(负值)、+(正值) 没啥价值,但是存在此操作符;原创 2024-07-11 15:33:43 · 964 阅读 · 3 评论 -
学习C语言两个月后的收获(篇目6)#超详细的#整型提升 #算术转换 #操作符的属性
本文将抽丝剥茧地讲述在表达式求值时因为操作数类型的不同而存在的整型提升和算术转换;以及操作符的属性),对于理解本篇文章十分有帮助1、为什么存在整型提升与算术转换?因为CPU计算整型数据的最小长度为 4Byte,且是不同类型的数据在内存中所占的空间不同,就会导致其二进制序列的位数不同,为了利于计算,当操作符的各个操作数的类型(大于4Byte)不同时,就会发生算术转换.有符号整型的提升:用其符号位来填补无符号整型的提升:直接补0向上转换类型4、操作符的属性:操作符有优先级和结合性。相邻两个操作符之间。原创 2024-07-10 18:12:00 · 1409 阅读 · 0 评论 -
学习C语言两个月后的收获(篇目五)#超级详细的 #数据在内存中的存储 #移位操作符 #位操作符 #移位操作符与位操作符的实际应用
本片文章将会细致深入地讲解 整数的三种二进制表示形式:原码、反码、补码之间的关系、存在的意义;移位操作符:>;位操作符: & 、 | 、^ 、~ 的注意事项和规则;文章结尾有三个实际使用移位操作符与位操作符的例子注:全文详细,非常适合新手阅读一、数据在内存中的存储思考:在开始移位操作符之前,我们先来了解一下数据在内存中的存储方式是怎么样的。众所周知,计算机存储数据是以二进制的形式存储的。什么是二进制呢?二进制是数据的一种表现形式,常见的进制有二进制、八进制、十进制、十六进制。原创 2024-07-04 17:17:05 · 984 阅读 · 0 评论 -
学习C语言两个月后的收获(篇目四)#超详细的数组讲解
我在初次接触数组的时候就常常搞不清楚数组使用的原理。本文将会从我当时学习的感受去深入讲解一维、二维数组的创建、使用、在内存中的存储形式。而我们如果把一维数组当作数组的元素,那么这个数组就是二维数组(请务必记住这句话,这句话是理解的重点);当然,如果我们把二维数组当作数组的元素,此时的数组就为三维数组;二维以上的数组统称为多维数组原创 2024-06-18 22:26:54 · 1578 阅读 · 6 评论 -
学习C语言两个月后的收获(篇目三) #算术操作符 #强制类型转换 #关系操作符 #条件操作符 #逻辑操作符
分为整数的除法和小数的除法;% :模(取余) 分有整除求模和负数求模 !!!没有小数求模!!!初始化: 在变量创建的时候给它一个值赋值:在变量创建好了之后,再给它一个值在条件判断时,注意区别 ’=‘ 与 ‘==’ ,‘=’ 是赋值,‘==’ 才表示相等逻辑操作符 : && 、 || 、 !原创 2024-06-16 18:58:36 · 1057 阅读 · 0 评论 -
学习C语言两个月后的收获(篇目二) #超详细的scanf() 讲解-->基本用法、scanf() 的返回值 、占位符、赋值忽略符
用户输入的数据会先放入缓存(内存区域),等按下回车键之后,按照占位符对缓存进行解读 。解读用户数据时,会从上一次遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符开始。 只有scanf() 在处理非%c 类型的数据时,会主动跳过、过滤掉空白字符,包括空格、制表符、换行符(即使按回车键将输入分为了几行,也不影响解读)%*c ;在 占位符的% 后面添加一个 赋值忽略符 * ,表示 这个占位符没有对应的变量,解读后不必返回。简单来说就是这个占位符不会有返回值,解析后就被丢弃了。原创 2024-06-15 20:58:06 · 1312 阅读 · 0 评论 -
C语言基础收获篇目:#strlen() 的本质 ;strlen ()求字符串长度,为什么还可以通过数组的首元素地址求到数组中字符串的长度? #sizeof
我是这样理解sizeof的:类型所占空间*数量。而在函数中,ch不再是数组,而仅仅是一个指针,是ch数组首元素的地址。将数组名传给函数,函数这边接受的是数组首元素的地址。strlen () 可以求出字符串长度,可是为什么在函数中可以利用字符串数组首元素的地址,而求出这个字符数组的长度呢?上面这个代码中,strlen给人的感觉就是 ,strlen顺着数组首元素地址找到了在函数外面的数组并且完成了它的任务;也就是说,strlen通过这个ch指针去找到了这个原本的数组,也就是说strlen 执行的参数是指针!原创 2024-06-14 20:16:42 · 449 阅读 · 0 评论 -
学习c语言两个月后的收获(篇目一) #printf 、占位符、转义字符、ASCII码值、32个关键字、语句分类
当寄存器在处理某些数据的时候,内存中的数据就可以往高速缓存中拿,而高速缓存中的数据也可以往寄存器中拿(保证大部分的数据能在寄存器中被找到)-->这样就可以大大提升CPU的计算速度。有点像打字时选择了前一个字符,当你要往后继续输入时,后面输入的这个字符会将选择区域的字符给取代,后面输入的这个字符会将\b前一个字符给取代。1.空语句:当格式要求在某个位置需要放置一个语句的时候,但是又不想让它执行任何-->就可以使用空语句-->这个语句不需要做任何事。原创 2024-06-13 21:12:51 · 1038 阅读 · 0 评论
分享