- 博客(28)
- 收藏
- 关注
原创 数组——初识数据结构
本文介绍了C语言中一维和二维数组的基本概念和使用方法。主要内容包括:数组的创建与初始化方式(包括变长数组和不完全初始化),数组元素访问与内存存储(连续地址空间),数组越界问题,以及冒泡排序算法的实现。特别强调了数组名在大多数情况下代表首元素地址,但在sizeof和&操作时例外。文章还通过地址打印实验验证了数组元素在内存中的连续存储特性,并指出二维数组可以视为连续的一维数组存储。最后通过示例代码演示了正确传递数组大小参数进行排序的方法。
2025-07-22 16:39:33
922
原创 递归——最烧脑的一集
文章摘要:递归是程序调用自身的编程技巧,通过将复杂问题分解为相似小问题来简化计算。关键要素包括:1.必须有限制条件;2.每次递归更接近终止条件。示例展示了按位打印数字的递归过程(递推和回归两个阶段),并指出无限递归会导致栈溢出。此外,文章还提到递归应用的局限性,如斐波那契数列计算中可能出现的效率问题,建议对大数计算采用迭代替代递归。
2025-07-22 15:37:17
296
原创 函数——C语言的重要部分
本文系统介绍了C语言中函数的概念与应用。首先阐述了函数作为子程序的定义和特性,包括输入参数、返回值及封装性。重点讲解了库函数的作用和使用方法,通过strcpy、memset等实例演示了字符串操作函数的具体应用。详细区分了传值调用和传址调用的区别,并以交换变量值为例说明参数传递机制。文章还包含了素数判断、闰年计算、二分查找等实用函数练习,并介绍了函数声明、嵌套调用、链式访问等进阶内容。最后以商业代码开发为例,说明了通过静态库(.lib)和头文件(.h)实现代码封装和分发的完整流程,强调函数模块化设计在软件开发
2025-07-22 15:20:05
713
原创 分支和循环语句
本文介绍了C语言的基本程序结构、控制语句和常见编程实践。主要内容包括:1. C语言的三种基本结构(顺序、选择、循环);2. 分支语句(if/switch)和循环语句(while/for/do-while)的语法和使用方法;3. 输入输出函数getchar/putchar的应用;4. 两个实践案例:猜数字游戏(使用随机数生成和循环判断)和二分查找算法;5. 调试技巧和常见错误分析。文章通过具体代码示例详细讲解了各语法结构的应用场景和注意事项,特别强调了循环控制变量修改的风险和随机数生成的正确方法,最后提供了完
2025-07-22 11:33:33
415
原创 初始指针和结构体
本文介绍了C语言中指针和结构体的基本概念。指针本质是内存地址,32位系统可管理4GB内存空间。通过取地址符&和%p格式可以操作和打印地址,指针变量通过*解引用访问目标对象。结构体用于描述复杂数据类型,可以通过.运算符或指针访问成员变量。文章还解释了内存地址的16进制表示和数据存储方式,为后续深入学习指针和结构体打下基础。
2025-07-21 22:56:35
193
原创 C语言常见关键字和define
本文概述了C语言中的关键字及其功能,包括变量类型(如char、int、double)、流程控制(如if、for、while)、存储类别(如auto、static、register)等。重点解释了static关键字的三种用法:修饰局部变量会改变其存储位置和生命周期但不改变作用域;修饰全局变量和函数会将其外部链接属性变为内部链接属性,限制其使用范围。文章还介绍了寄存器优化原理、define定义常量和宏的方法,以及基本数据类型和复合类型的分类。这些内容涵盖了C语言编程中常用的语法要素和底层实现原理。
2025-07-21 22:44:51
505
原创 全排列大杂烩——回溯算法
回溯,顾名思义就是回到之前的状态,常见的有时空回溯(祖安小伙艾克)以及今天要了解的回溯算法回溯算法是一种通过探索所有可能的候选解来找出所有解的通用算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会放弃该解,回退到上一步,并尝试其他的可能性。回溯算法可以看成是一种有组织的穷举方法,算是暴力算法的优化吧有以下特点:1.系统性:会按照某种顺序系统性的探索空间2.跳跃性:当发现当前的路径并不能得到解时,立即立即回溯,返回上一路径概念听的有点困了,还是来看看题吧家人们。
2025-06-10 15:22:32
941
原创 缺失的第一个正整数——原地哈希
这个是牛客101题中的第53题,题目描述是给一个无重复元素的数组,找出没有出现的最小的正整数乍一看似乎不太难,但是要做到时间复杂度O(n)也是要花点心思的。
2025-06-09 20:55:36
415
原创 数组中只出现一次的两个数-位运算
本文介绍了利用位运算解决数组中找出两个只出现一次数字的问题。首先复习了位运算的基础知识,包括逻辑位运算(与、或、异或等)和位移运算符。解题思路是:通过异或运算将所有数字处理,得到两个目标数字的异或结果;然后找到首个不同的二进制位,将数组分为两部分分别异或,最终得到两个目标数字。文末给出了C++实现代码,包含位运算的具体应用和升序输出处理。
2025-06-06 09:54:37
394
原创 C++内存管理
char2也是在栈上面,字符串确实是存放在常量区的,但是这里表示的意思是讲字符串存放进数组里,而*char也表示首元素的地址,数组开好后就放在了栈上面,所以*char就是存放在栈上面的。因为系统在开辟空间时会多开4个字节,来存储要调用多少次构造函数,在delete时,指针本来指向数组的首位,这时就会向前移动四个字节,取出里面的数字,就能得出要调用多少次析构函数了。pchar3是一个局部变量,是存放在栈上面的,而*pchar3则是指pchar3所指向的那块空间,是存放在常量区的。
2024-07-19 14:39:18
388
原创 C++友元
至于为什么要加const是因为当传第二个参数2时,会先产生一个临时对象,这个临时对象具有常性,所以使用引用传参时才需要加上const。这里的意思是Date是Time的友元,那么就能在Date里访问Time,但是Time并不能访问Date。另外,如果内部类是共有的就可以直接使用,若是私有的就不能使用了,说明内部类也受访问限定符的限制。这种友元关系是单向的,我是你的友元,你不一定是我的友元。这里的类B是类A的一个内部类,还可以看出A的大小只有4。就能发现,类B跟类A在空间独立的,只是受A的类域限制。
2024-07-19 14:34:11
216
原创 const修饰的成员,静态成员和匿名对象
这里调用了13次构造函数,除了前面的3次,还有创建数组的10次,这个数组里面10个对象,就会调用10次构造函数,自定义类型的数组是会调用构造函数进行初始化的。就可以把const加到这个位置,这时的函数叫cosnt成员函数,这样就可以修饰this指针了。其实是出现了权限的放大,这里传给print函数时的类型是A的this指针,但是aa的类型是const修饰后的A的指针。如果定义全局变量就会出现谁都能修改的问题,而C++讲究的是封装,所以全局变量并不靠谱。相对的,在静态成员函数里并不能访问非静态的成员。
2024-07-19 14:31:25
259
原创 运算符重载和初始化列表
但由于调用函数是上面的,那么具体使用就变成了下面的,因为ostream类不能修改,所以就只能写在日期类里面了,但是写在日期类里面的话,日期类对象就抢占了第一个参数,所以cout就只能写在后面了。默认生成的构造函数对内置类型不作处理,这里的_x成员变量是int类型的,编译器也不会作处理,但是这是个const修饰的变量,const修饰的变量只读不写,必须在定义的位置就初始化。这里的两行代码也是拷贝构造;i并不是直接转换成a的,而是会产生一个double类型的临时变量,i的值赋给临时变量,再由临时变量赋值给a。
2024-07-19 14:24:30
598
原创 常见关键字
C语言中常见的关键字总共有这么些下面将对部分关键字进行附加解释auto自动的,所有的局部变量都等于自动变量break停止,用在循环中caseswitch case语句char属于一种类型const用来修饰指针,变量,continue继续,用于循环defaultswitch语句里的默认选项dodo while 循环double属于一种类型short属于一种类型int属于一种类型long属于一种类型long long属于一种类型float属于一种类型。
2023-08-24 19:52:24
96
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人