- 博客(28)
- 收藏
- 关注
原创 strlen;strcpy ;strcat;strcmp
strlen核心是统计\0前的字符数,必须保证字符串以\0结尾;区分strlen(运行时、有效长度)和sizeof(编译时、内存大小);注意size_t无符号类型的运算陷阱,空指针需提前判断。函数优点缺点适用场景strcpy简单、效率高无长度检查,易缓冲区溢出确定源字符串长度 ≤ 目标缓冲区大小strncpy可控拷贝长度需手动补'\0',可能填充多余'\0'需限制拷贝长度的场景strlcpy自动补'\0'、更安全非标准 C,跨平台性差Linux/BSD 系统,追求安全优先。
2025-12-18 23:38:04
1131
1
原创 qsort函数(快速排序)
qsort是 C 语言中灵活且高效的通用排序函数,核心是通过自定义比较函数适配任意类型数组。正确传递数组地址、元素个数、元素大小;编写符合规则的比较函数(重点是void*类型转换)。
2025-12-10 23:11:26
366
原创 指针进阶: 回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数是,我们就说这是回调函数。回调函数不是由该函数的实现方式直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应回调函数是通过函数指针调用的函数:将函数的地址(函数指针)作为参数传递给另一个函数,当满足特定条件 / 事件时,被调用的函数通过该指针执行目标函数(回调函数)。不由函数的实现者直接调用,而是由 “外部调用者” 触发;实现解耦。
2025-12-10 23:04:48
765
原创 计算器回调函数
这段代码的核心是函数指针的应用:通过将运算函数作为参数传递,实现了代码复用(calc函数统一处理输入输出),同时注释部分展示了函数指针数组的进阶用法,为扩展功能提供了思路。注意代码中存在中文乱码,需调整编码格式解决。
2025-12-10 22:56:03
380
原创 指针进阶:函数指针详解
C 标准库qsort// 1. 通用排序函数(接收函数指针作为比较规则)i < len-1;i++) {j++) {// 通过函数指针调用比较规则// 2. 比较规则1:升序// a>b返回正数,触发交换// 3. 比较规则2:降序// b>a返回正数,触发交换// 传递升序比较函数i<len;// 1 2 3 4// 传递降序比较函数i<len;
2025-12-10 20:37:45
700
原创 指针进阶:一/二维数组传参;二级指针传参;函数指针与数组指针
一维数组传参:本质传首元素地址,形参用T*或T[]均可,需额外传递数组长度;二维数组传参:本质传指向一维数组的指针,必须指定列数,行数可省略,形参用T[][](指定列数)或T(*)[N]均可;动态二维数组(malloc):用T**传参,需传递行数和列数。类型** 变量名int* p1 = # // 一级指针:指向int变量// 二级指针:指向一级指针p1*p2:解引用二级指针,得到一级指针p1;**p2:解引用两次,得到最终的num。二级指针传参的核心目的是在函数内修改一级指针变量本身。
2025-12-10 20:21:40
1079
原创 字符指针;字符数组;指针数组和数组指针(指针进阶)
/ 1. 指向单个字符// p1 指向字符变量 ch 的地址// 2. 指向字符串常量(最常用)// p2 指向字符串常量 "Hello" 的首字符 'H' 的地址// 3. 指向字符数组(数组名本身是首地址)// p3 指向字符数组 arr 的首元素 'W'// 打印验证// 输出:*p1 = A(解引用取单个字符)// 输出:p2 = Hello(字符串打印,从首地址到 '\0' 结束)// 输出:p3 = Worldreturn 0;这里有个要注意的是。
2025-12-08 23:35:57
1491
原创 数据在内存中的存储;浮点型在内存中的存储
数据在内存中的存储是编程的核心基础,本质是—— 内存可视为 “字节数组”,每个字节(8 bit)对应唯一的内存地址(如 0x00001000),数据存储本质是将其编码为二进制后,写入指定地址的字节中。
2025-12-03 22:05:20
936
原创 assert函数;const修饰指针变量
验证函数参数的合法性(如指针非空、参数范围有效);验证程序逻辑的一致性(如 “循环结束后变量值符合预期”“数组索引不越界”);标记 “理论上永远不会到达的代码”(如default分支):case 1: /* 处理逻辑 */ break;case 2: /* 处理逻辑 */ break;default:assert(0 && "无效的 cmd 值");// 断言失败,提示无效 cmdassert是调试工具,用于快速定位程序内部逻辑错误,不能替代错误处理;发布版本必须通过NDEBUG。
2025-11-27 16:28:23
812
原创 指针;野指针;二级指针;指针越界
数据类型 *指针变量名;核心说明::表示 “这是一个指针变量”;数据类型:指针指向的目标变量的数据类型(决定解引用时访问的内存宽度);变量名:指针变量本身的名字(如p,而非*pint a = 10;int *p;// 定义整型指针p(未初始化,危险!p = &a;// 给p赋值:&a是变量a的地址(取地址操作)// 定义+初始化(推荐)指针相减:仅同类型、同内存块的指针可减,结果是「元素个数差」(非字节数),用于计算长度、下标差;指针关系运算:==!:任意合法指针可用(重点用于判断。
2025-11-25 11:52:13
1248
原创 赋值操作符;单目操作符;双目操作符;逻辑操作符;条件操作符
在 C 语言中,整型提升(Integer Promotion)是编译器对「小于int的整数类型」(charshort及其有符号 / 无符号变体)的强制隐式转换 —— 运算时自动转为int(特殊情况转为),运算后按需转回原类型。它是适配硬件、统一运算规则的核心机制,以下从「定义→意义→如何提升→实战避坑」层层拆解。当charshort(含signedunsigned)参与表达式运算(如算术、关系、位运算)时,编译器会自动将其转换为int类型(若原类型取值范围超过int,则转为。
2025-11-19 23:36:57
1298
原创 操作符分类
- * / %上述是五个算术操作符,其中有两个需要注意的点:1. / 该运算符包含整形除法和浮点型的除法2. % 使用该操作符时,两端必须是整数。
2025-11-18 23:50:39
790
原创 动态内存分配。纸上得来终觉浅,绝知此事要躬行
上面的函数就是相当于我们借助malloc函数向内存申请了number倍的int类型的空间地址,为什么是int类型的?我们没有free的时候在小程序上是没有太大的问题的,但是在大项目中这就非常有必要了,通常我们malloc之后free是一个好习惯所以希望未来使用的时候能好好遵守。向malloc申请的空间的大小是以字节为单位的,返回的结果是void*,需要类型转换为自己需要的类型。思考思考,我们在这里向内存借了一块地方来存储我们的数组,那当我们用完了是不是应该还回去,俗话说有借有还再借不难嘛,那么如何还呢?
2025-11-17 23:09:53
336
原创 sizeof与strlen;abs函数;toupper/tolower;scanf与fgets函数;strcat 函数
/ 没有'\0',不是标准字符串printf("str长度: %zu\n", strlen(str));// 未定义行为(可能返回随机值,如3、10等)return 0;sizeof用于计算 “内存占用大小”,是编译时确定的运算符,适用于所有类型。strlen用于计算 “字符串有效长度”,是运行时的库函数,仅适用于以'\0'结尾的字符串。实际使用时需根据需求选择:计算内存分配用sizeof,计算字符串字符数用strlen。toupper和tolower。
2025-11-11 12:33:18
798
原创 小游戏:三子棋
3.在创造一个游戏的时候我们要先创建出他的游戏内容相当于背景图一样的东西,而对于三子棋我们就需要创造一个3*3的田字格,第一步就是先初始化棋盘,我们首先创建了个二维数组,作为我们棋盘中存放棋子的容器,但是在游戏开始时我们所见到的棋盘的田字格内应该是空白的,所以要进行初始化,将二维数组中的棋子都变为‘ ’,在<game.h>中我们进行了声明。3.我们在绘制田字格时用了宏定义在后续的图像绘制时数组的[ ]里面改为了宏定义里面的名称,这样在我们以后想玩更大的游戏的时候只需要在宏定义那里更改内容就好。
2025-11-02 22:52:09
886
原创 一维数组与二维数组的创建和初始化;数组的越界;数组名的理解
C 语言数组长度必须是常量(C99 前),创建时需指定数据类型。初始化时,完全初始化可省略长度;部分初始化未赋值元素为 0(或 '\0')。字符数组用字符串初始化时,会自动添加'\0',需注意长度匹配。未初始化的局部数组元素值随机,使用前需手动赋值。C 语言二维数组的列数必须显式指定(行数可省略,由初始化元素推断)。初始化推荐用按行嵌套大括号的方式,结构清晰,不易出错。未赋值的元素自动为 0(全局 / 静态数组)或随机值(局部数组)。
2025-11-02 00:06:37
990
原创 递归与迭代;fabs(计算浮点数绝对值的库函数);汉诺塔问题;青蛙跳台阶问题;栈溢出现象
【代码】递归与迭代;fabs(计算浮点数绝对值的库函数);汉诺塔问题;青蛙跳台阶问题;栈溢出现象。
2025-11-01 23:31:13
970
原创 函数递归;%d和%u;函数栈帧的创建和销毁;编写函数不允许创建临时变量,求字符串长度(递归求解)
(2.)递归关系:将原问题拆解为更小规模的子问题,通过调用自身解决子问题,并组合子问题的结果得到原问题的解。(每次递归调用后越来越接近限制条件)(1.)终止条件:必须存在一个明确的条件,当满足时函数不再递归调用,直接返回结果(避免无限递归导致栈溢出)。递归的主要思想是:大事化小。
2025-10-28 23:58:20
1435
原创 函数的嵌套调用与链式访问;printf函数;main函数是有参数的;函数的声明与定义;
内层printf先执行→打印内容到屏幕→返回字符数→这个字符数作为外层printf的参数→外层再打印并返回新的字符数,最终形成 “100→3→1” 的输出顺序。(2.)常用格式说明符格式符对应数据类型功能描述%dint以十进制形式输出有符号整数%u以十进制形式输出无符号整数%o以八进制形式输出无符号整数(无前缀0%x%X以十六进制形式输出无符号整数(%x小写,%X大写,无前缀0x0X%f以小数形式输出浮点数(默认保留 6 位小数)%lfdouble输出双精度浮点数(C99 标准)%cchar。
2025-10-28 23:05:48
761
原创 (指针)写一次函数,每调用一次这个函数,就会将sum值+1
修改变量的值:ADD函数中的(*p)++ 是关键操作。*p表示“获取指针p指向地址的值”(num的值),(*p)++ 就是将这个值+1,直接修改了num本身。所以在后续每次调用时num都会+1.这个代码通过传地址的方式,实现了对主函数中变量num的修改,在函数传参的时候,&num传递的是num的地址(非变量的值),在自定义函数中用int *p接收地址,p成为了指向num的指针。
2025-10-28 22:00:57
475
原创 函数:库函数,自定义参数;形参与实参(数值交换);判断是否为素数;sqrt函数;
return 0;语句项ret_type 返回值类型fun_name 函数名paral 函数参数函数声明(可选但推荐)返回值类型 函数名(参数列表);代码复用模块化参数类型匹配// 函数声明// 求两个数的最大值// 打印结果// 调用 max 函数// 调用 printResult 函数return 0;// 函数定义:求最大值a : b;// 三目运算符返回较大值// 函数定义:打印结果。
2025-10-26 22:47:56
1371
原创 猜数字游戏;rand()函数生成随机数;时间戳:time函数。
以上示例是time()函数与srand()函数混合使用的示例,是c语言中设置随机数种子的标准写法,效果是根据当前的时间生成一个随机的数字,这样能够使每次猜数的数字都不一样具有随机性,大家都知道rand函数确实能够生成随机数,但是当我们重复运行时会发现他的随机数字会重复就类似于第一次循环是(1.3.6.5.9),那第二次生成的数字也是(1.3.6.5.9),显然这样并不具有随机性了,聪明的玩家很快会找到规律。返回的秒数相同,会导致种子重复,生成相同的随机数序列。//指针 int*p=NULL。
2025-10-22 22:01:41
638
原创 getchar函数与scanf函数;system库函数(一个清空屏幕的用法);Sleep(1000)可以每次延迟一秒。
3.Sleep()函数是延迟程序的进行时间,Sleep(1000)可以延迟一秒的速度;1.个人理解:getchar函数应该是跟scanf类似的他可以输入一些字符,定义getchar函数时要用int类型。2.system是一个库函数,可以执行系统命令,搭配#include <stdlib.h>头文件使用。在上述程序中scanf先读入字符串但是不读入空格,在接下来\n被getchar函数读入导致程序出错。它对应的效果就是会使上述循环运行时的数据消失后续取而代之的是下一次循环的结果;(1)一种用法:清空屏幕。
2025-10-21 23:34:20
233
1
原创 同一个工程文件中只能有一个main函数;strcmp函数;
在同一个工程文件中,另一个.c文件的main需要注释掉。在测试不同代码重新写main的时候,你把之前的main给注释掉,这样就可以测试了。1.在vs编译器中对于scanf_s的使用需要标注缓冲区大小,在曾经遇到的问题中getchar()与scanf_s()函数出现了。2.得知了新的strcmp函数,他需要头文件#include <string.h>头文件来配合使用;该函数是用来比较两个字符串是否相等的,同时今日学习到判断两个字符串是否相等无法用 ==异常的问题,因此应该注意使用范围,例如上述图文。
2025-10-21 23:03:19
271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅