自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 小白也能懂的编译与链接:从代码到程序的“变量之路”

链接是一个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。静态语义分析通常包括声明和类型的匹配,类型的转换等。就是根据汇编指令和机器指令的对照表一一的进行翻译,也不做指令优化。函数的地址,对于全局变量g_val 也是类似的方法来修正地址。(生成的目标文件(.obj)与最终生成的可执行程序格式相同,文件组织形式相同)第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。等待最后链接的时候由链接器根据引用的符号。的地址,但是由于每个文件是单独编译的,在编译器编译。

2026-02-05 18:06:47 621

原创 预编译详解

C语言设置了一下预定义符号,可以直接使用,预定义符号也是在预处理期间处理的。int main()//VS并没有完全遵守ANSI Creturn 0;//为register这个关键字创建一个简短的名字;//用更形象的符号来替换一种实现case//在写case语句的时候自动把break写上//如果定义的stuff过长,可以分成几行写,出了最后一行外,每行的后面都假设一个反斜杠(续行符)。思考:在#define定义标识符的时候要不要在最后加上;?建议不要加上。

2026-02-04 15:23:27 795

原创 文件操作总结

功能函数名适用于字符输入函数fgetc所有输入流字符输出函数fputc所有输出流文本行输入函数fgets所有输入流文本行输出函数fputs所有输出流格式化输入函数fscanf所有输入流格式化输出函数fprintf所有输出流二进制输入fread文件二进制输出fwrite文件接下来我们进行函数的使用向文件中写字符,以写的形式打开文件读取文件中的字符,以读的形式打开文件intf。

2026-01-29 00:15:06 1009

原创 结构体实现位段

位段的声明和结构体是类似的,有两个不同:1.位段的成员必须是int、unsigned int或signed int,在C99中位段成员的类型也可以选择其他类型。2.位段的成员名后边有一个冒号和一个数字。int _b : 4;A就是一个位段类型。位指的是二进制的位。那么位段A所占内存的大小是多少呢?

2026-01-26 15:19:34 600

原创 结构体内存对齐

依次比较VS默认对齐数与s4成员变量的大小,依次确定每个成员变量的偏移量,a对齐数为1,b对齐数为4,嵌套的结构体成员s3对齐到自己的成员最大对齐数的整数倍处即偏移量为8处,c偏移量为24,d偏移量为32,此时总大小为33,不是最大对齐数8的整数倍,所以浪费一部分空间使s4占40个字节的大小。4.如果嵌套了结构体的情况,嵌套的结构体成员对齐到自己的成员最大对齐数的整数倍处,结构体的整体大小就是所以对齐数(含嵌套结构体中成员的对齐数)的整数倍。2.其他成员变量对齐到某个数字(对齐数)的整数倍的地址处。

2026-01-26 10:08:46 982

原创 自定义类型:结构体,联合体,枚举

上述结构体设计很简单,用起来也很方便,但是结构的设计中包含了所以礼品的各种属性,这样使得结构体的大小会偏大,比较浪费内存。答案是不行的,因为Node是对前面的匿名结构体类型的重命名产生的,但是在匿名结构体内部提前使用Node类型来创建成员变量,这是不行的。联合体的成员共用同一块内存空间,这样一个联合体变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。仔细分析,其实是不行的,如果一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷大,是不合理的。

2026-01-25 15:22:41 791

原创 函数栈帧的创建与销毁

好的,各位!我们已经对函数有了初步的认识,知道它怎么定义、如何调用。那么今天,我就带大家一起来“扒开”代码的表面,看看当函数执行时,底层那个默默忙碌的“现场”——函数栈帧,是如何一步步被创建、又悄然被销毁的。理解了它,你会对程序的理解更深一层!过程有点烧脑,但别怕,咱们慢慢来~💪局部变量是如何创建的?为什么局部变量不初始化内容是随机的?例如之前的烫烫烫?函数调用时参数是如何传递的?传参的顺序是怎样的?函数的形参和实参是什么关系?函数的返回值是如何带回的函数调用结束之后是怎么返回的?

2026-01-24 16:08:46 871

原创 深入理解动态内存管理

C/C++程序内存分配的几个区域:1.栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。2.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能有OS回收。分配方式类似于链表。3.数据段(静态区):(stack)存放全局变量、静态数据。程序结束后由系统释放。

2026-01-24 16:06:25 1139

原创 C语言内存函数实战:memcpy/memmove/memset/memcmp用法与区别

C语言内存函数是针对内存块(一块内存)来处理的mem-memory-记忆-内存memcpy-内存拷贝memmove-内存移动memset-内存设置memcmp-内存比较。

2026-01-23 16:56:29 976

原创 新手必看:字符函数与字符串函数的核心用法总结

来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,大的字符所在的字符串大于另外一个。通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。

2026-01-17 18:34:04 901

原创 深入理解指针4

这里a是字符指针数组,数组元素分别为3个常量字符串首字符的地址,将字符数组的地址应该放在一个二级指针(char**)中,二级指针加减之后其指向的变量也会发生变化我们必须明确这一点,搞清楚对应关系,当然这里%s打印需要地址,我们提供的pa就是常量字符串首字符的地址。&p[4][2] - &a[4][2]的结果本身是-4,用%d打印结果是-4,但是用%p打印会将内存中存储的-4的补码当做无符号整型数对待,会是一个很大的数。//2.&a的类型是int(*) [4],*&a这里访问的是整个数组的大小。

2026-01-12 19:59:06 972

原创 深入理解指针3

因为红色框中的代码,只有调用函数的逻辑是有差异的,我们可以把调用的函数的地址以参数的形式传递过去,使用函数指针接收,函数指针指向什么函数就调用什么函数,这里其实使用的就是回调函数的功能。这里我们在Cal函数的参数设为函数指针,在函数内通过函数地址来调用函数,而被函数指针调用的函数就是回调函数,不同于使用函数指针数组通过下标调用数组元素中的函数地址,是不同的函数调用形式。我们写的计算器实现的代码中,红色框中的代码是重复出现的,其中虽然执行计算的逻辑是区别的,但是输入输出操作是冗余的,有没有办法,简化一些呢?

2026-01-10 19:24:13 1009

原创 深入理解指针2

一维数组传参,形参的部分可以写成数组的形式也可以写成指针的形式。正是因为数组传参这一特点我们在函数内部是没有办法求数组元素个数的,所以我们需要在主函数中算出来并传给函数。

2026-01-09 19:06:28 813

原创 深入理解指针 1

学指针的过程,有点像第一次拿到一张内存地图——起初那些地址和箭头让人头晕,直到某天忽然看懂,原来每一个变量都在那里有着自己的坐标。一开始可能会觉得绕,为什么。

2026-01-08 20:31:41 1035

原创 数据在内存中的存储

其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序我们分为大端字节序存储和小端字节序存储,下面是具体概念:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的地低地址处。是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高低地址处。

2026-01-07 17:44:12 765

原创 从“套娃”到魔法:递归函数如何使用“自己”解决复杂问题

学递归的过程,像是一次温柔的“自我对话”——从问题出发,不断向更小的自己提问,直到遇见那个最简单的答案,再沿着来路轻轻返回。一开始可能会觉得绕,会对着阶乘和斐波那契数列皱眉头,会在汉诺塔的移动里晕头转向……这都很正常。递归不是一眼就能看透的语法,它是一种思维方式,一种把大问题安静拆解、再静静组合的耐心。如果你正在练习递归,不妨从最简单的例子开始,画一画调用图,走一走递推与回归的路。慢慢你会感受到,递归里藏着的是一种清晰的秩序,也是一种对待复杂问题的从容姿态。

2026-01-06 19:39:40 781

原创 函数:看似抽象的公式,实则解决问题的“万能钥匙”

了解了库函数,我们的关注度应该聚焦在自定义函数上,自定义函数其实更加重要,也给程序员写代码带来了更多的创造性。一般我们在使用函数的时候,直接将函数写出来就使用了。比如:我们要写一个函数判断一年是否是闰年。return 1;printf("闰年\n");elseprintf("非闰年\n");return 0;上述代码包括了函数的定义和调用,这种场景下是函数的定义在调用之前,没什么问题。

2026-01-06 17:49:22 984

原创 数组入门密匙

数组是C语言中组织与处理数据的基石,也是通往更复杂数据结构的起点。从一维的线性表到二维的平面网格,从简单的元素存取到冒泡排序这样的经典算法,数组教会我们如何将零散的数据封装为有序的整体,并在内存中高效存储与访问。掌握数组,你不仅是在学习一种语法结构,更是在培养“数据集合”的思维方式。多练习遍历、多思考边界、多观察内存布局,你会逐渐理解下标背后的地址逻辑,也会体会到用数组实现算法的清晰与力量。编程之路,始于对数据的组织。

2026-01-05 16:28:13 982

原创 新手也能懂的C语言分支循环

分支与循环不仅是C语言的语法基础,更是结构化编程思维的起点。从if 的选择判断到switch的多路分支,从 while 的持续执行到 for 的精简迭代,再到 break 与 continue 对流程的精细控制——每一个结构都在教我们如何将复杂的现实问题,分解为清晰可执行的逻辑单元。掌握它们,你不仅在学会写代码,更在学会如何“思考代码”:如何让程序做出判断,如何让重复操作变得优雅,如何让逻辑跳出或继续。多练习、多重构、多调试,你会发现,再复杂的流程,也由这些简单结构组合而成。

2026-01-05 14:38:54 1049

原创 VS实用调试技巧

bug本意是“昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。“Bug”的创始人格蕾丝·赫柏(Grace Murray Hopper),她是一位为美国海军工作的电脑专家,1947年9月9日,格蕾丝·赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。

2026-01-02 17:27:04 1057

原创 C语言操作符:从“一脸懵”到“玩得溜”,这篇通关指南帮你拿捏

/代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化//代码3int data;//结构体嵌套初始化//结构体嵌套初始化。

2026-01-02 15:55:07 1264

原创 VS2022使用scanf报错?3步快速解决,新手也可看懂

通过前面的学习我们了解到scanf是由返回值的,并且可以利用其返回值来判断scanf读取是否成功,且scanf具有不安全性不会自行判断读取的内容是否会超过变量内存从而导致栈溢出的现象,所以VS编译器会对没有使用scanf的返回值警报进而导致错误。写入保存即可,但是我们发现权限不够无法保存,这里我们将文件复制到桌面上再保存即可,保存成功之后再替换原来的文件,即可完成对。在VS上.c/.cpp的文件,新建的时候其实就是拷贝了new++file.cpp的内容。.c/.cpp的文件的时候就会自动包含这句话了。

2026-01-01 17:27:42 192

原创 吃透printf和scanf:告别语法错误,掌握C语言IO

基本用法printf()的作用是将参数文本输出到屏幕。它名字里面的f代表format(格式化),表示可以定制输出文本的格式。return 0;上面命令会在屏幕上输出一行文字“Hello World”。printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行。为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\n。printf()是在标准库的头文件stdio.h定义的。

2026-01-01 17:26:28 1106

原创 C语言初阶

在VS上写代码我们需要创建项目,直接新建项目即可。在项目中就可以添加源文件和头文件。C语言把.c为后缀的文件称为源文件,把.h为后缀的文件称为头文件。C语言中有一批保留的名字的符号,比如:intifreturn,这些符号被称为保留字或者关键字。关键字都有特殊的意义,是保留给C语言使用的程序员自己在创建标识符的时候是不能和关键字重复的关键字也是不能自己创建的。注:define不是关键字,是预处理指令charconstdoublefloatintlongshort。

2025-12-31 14:53:12 906

空空如也

空空如也

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

TA关注的人

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