- 博客(24)
- 收藏
- 关注
原创 【DAY17】内存函数
内存函数的核心价值总结内存函数是系统编程的基石,它们提供了直接、高效操作内存的原语。掌握它们意味着能写出更高效、更可控的代码。理解其原理有助于规避安全陷阱,并能在必要时实现自定义的高性能版本。未来发展趋势硬件加速:随着计算存储一体化(CIM)和专用内存操作指令的出现,内存函数的性能有望进一步提升。语言级安全:像Rust这样的语言正在推动内存安全成为默认选项,减少对不安全底层函数的依赖。异构计算:在CPU、GPU、NPU等混合系统中,内存函数的实现需要兼顾不同设备的特性。进一步学习资源推荐书籍。
2026-05-21 23:41:29
463
10
原创 【DAY16】字符函数和字符串函数
比较过程从两个字符串的首字符开始,依次比较对应字符的ASCII码值。这个函数是字符串查找函数,用来在主字符串中查找首次出现的子字符串,返回在主字符串中首次出现的子字符串的地址,在主字符串找不到子字符串的话就返回空指针。注意,不是分别比较两个字符串总共的ascii码值的大小,而是逐个字符比较,直到遇到不同的字符或者。这个函数实现了字符串的拷贝,是通过将字符串的字符一个一个搬运到对应的目标字符串,然后最后再搬运。的返回值是一样的,只不过限定了比较的字符个数,在限定的范围里来比较字符串的大小。
2026-04-13 23:06:25
405
9
原创 【DAY15】:深⼊理解指针(6)
表示指向起始元素的指针向后偏移4个字节(因为数组名a表示退化的指针,指向起始元素,类型是int*,所以+1能跳过四个字节),然后对偏移后指向的新内存空间一次性访问4个字节。这里值得注意一下,如果表达式的数据类型是不一样的话,编译器会自动进行隐式转换,将较小的类型自动转为较大的类型。,p是一个结构体指针,+1就是跳过一个结构体大小的字节,可以知道一个结构体变量的大小是20个字节,在这里。的数据,但是数组a指向的内存空间是不变的。,还是指针,只不过是不同类型的指针,+1可以跳过4个字节,所以输出。
2026-04-07 20:43:00
428
6
原创 指针大总结
指针其实就是内存单元的编码地址,每一个内存单元都有其对应的编码,这个编码就类似于现实生活的地址,在C语言就叫做指针。在现实生活中,我们有了朋友家的地址才能去拜访朋友;在计算机里,CPU要知道某一个内存单元的指针才能直接访问该内存单元和操作该内存单元。注意:在日常交流中,指针既可以理解成地址,又可以理解成指针变量,指针变量是用来存储某块内存区域的地址的。数据类型 * 指针变量名数据类型:表示指针指向数据的类型,比如intchardouble,如果指向的数据是函数就是int(*指针变量名)(int,int)。
2026-03-28 00:22:40
393
4
原创 模拟qsort函数
size_t num比较函数的两个参数都是指针,qsort函数规定了指针a位于指针b的左边,也就是说指针a指向起始元素的地址,指针b指向起始于元素后一个元素的地址。
2026-03-24 17:41:13
57
原创 【DAY14]深⼊理解指针(5)
回调函数并不是由该函数的实现方(调用函数)直接调用的,而是在特定的事件和条件发生时由调用函数进行回调,对特定的事件和条件进行响应。类型的函数指针,接收的类型也是被回调的函数的指针类型(函数名也可以表示函数指针)。这里我们要知道被回调的函数的参数类型和返回值的类型,按照这些类型创建函数指针来接收回调函数的地址。的左侧是结构体指针,右侧是结构体成员名,用来访问结构体的某个特定成员,通过结构体指针间接访问所指向结构体的成员。回调函数是在主调函数里作为调用函数的实参的函数指针指向的函数,这个函数指针指向回调函数。
2026-03-21 17:11:41
413
3
原创 二维数组传参本质解析
二维数组传参的本质是。此处的“首元素”在二维数组的语境下具有特殊含义,它不是一个基本数据类型(如int或char),而是构成该二维数组的一维数组。因此,传递给函数的实际上是一个指向一维数组的指针,即。为了深入理解这一本质,需要从内存布局、指针类型、以及C语言函数传参机制三个维度进行剖析。二维数组在逻辑上呈现为行与列的矩阵,但在物理内存中,所有元素(包括所有行中的所有列)是连续线性存储的。例如,一个定义为arr[0][0]arr[0][1], ...,arr[0][4]arr[1][0], ...,
2026-03-19 01:11:52
184
2
原创 【DAY12】深⼊理解指针(3)
⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。无论是几维数组,数组传参总是会退化成指针来传递,形参可以写成。
2026-03-12 23:47:19
340
原创 每日代码(3)
占位符来表示读取所有的字符直到遇到\n,但是它并不会读取这个换行符,这个换行符会继续留在缓冲区到下一次输入。下一次输入的时候一开始就遇到\n,停止读取,导致读取失败,返回值的数据类型是size_t类型(无符号整数),表示一个字符串的实际输入字符个数,所以用。对于给定的由小写字母和空格混合构成的字符串 s,将其翻转后输出。函数返回0,不能实现多次输入。因为要求是要将输入的字符串逆序输出,所以指针。因为输入的字符串里包含空格,所以要使用。一开始指向字符串的最后一个字符,用。s 的首尾不为空格。
2026-03-09 14:37:17
33
原创 【DAY10】深⼊理解指针(1)
的时候,控制总线向数据总线发送读操作指令,通过地址总线访问要读的内存单位(每个内存单元都有地址),数据从内存的某个内存单位通过数据总线传递到cpu的寄存器里。我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢?来进行的,32位有32根地址总线,每根线有0和1的两种状态(电脉冲的有无),那么32根线就有2^32种状态,每种状态的传输就是一个地址的传输。
2026-03-07 13:36:44
360
1
原创 DAY9:操作符详解
/结构体变量的定义int age;//初始化struct student stu1={"张三",20,"男","114514"};struct student stu2={"李四",18,"男","1919810"};//结构体嵌套初始化int x;int y;struct Stu//名字int age;//年龄//性别//学号//结构体里嵌套结构体}s1,s2;//嵌套初始化。
2026-03-05 23:20:40
357
原创 DAY8函数递归
函数不返回,函数对应的栈帧空间就⼀直占用着,所以如果一个函数存在着调用函数这个行为(函数递归)的话,被调用的函数要开辟属于自己的栈帧空间来保证调用期间所需的各种局部变量,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。上述就是⼀个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,函数可以自己调用自己,但不能无限递归,否则会陷⼊死递归,导致栈溢出 (Stackoverflow)。事实上,我们看到的许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更加清晰。
2026-02-27 20:12:20
847
原创 每日代码(2)
关键是兑换来的新汽水喝完后又产生空瓶子,假设我有20个空瓶子,兑换完喝光后我还剩下10个空瓶子,但我喝了10瓶汽水。通过图我们直到打印的菱形对角线长度是一样的,中间行长度最大,我们可以把打印的菱形分成上部分和下部分,上部分包含最长的行,用变量。,第一行打印11个,第二行打印9个,第三行打印7个,第四行打印5个,第五行打印3个,第六行打印1个。喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少汽水。,注意第一轮兑换余下来的空瓶子也要加上去。(i表示第i行,1<=i<=n)增加的,空格则是以。
2026-02-25 22:42:23
922
原创 DAY7扫雷游戏
再进一步分析,当我们排查出了某一个方框周围地雷的信息后,这个方框就要显示周围地雷的数量(如果周围没有地雷就自动向玩家显现,并且再次排查已显现方框周围的地雷信息),所以为了让玩家更直观查看到地雷排查的情况,我们就要把排查出的信息存储在对应排查的方框内存里并且打印出来向玩家展示。:如果我们排查的方框是在棋盘的边缘,那么在访问该位置四周的元素会出现越界的情况发生(有的元素并没有包含在数组内),为了防止数组越界访问,我们可以在9x9棋盘的基础上再在周围加上一圈创建成11x11的数组,地雷放置还是在9x9棋盘里。
2026-02-24 19:32:47
787
原创 Day6 函数
掌握了库函数后,我们应当将重点转向自定义函数。自定义函数更为关键,它为程序员提供了更大的创写代码的创造空间。⼀般我们在使⽤函数的时候,直接将函数写出来就使⽤了。⽐如:我们要写⼀个函数判断⼀年是否是闰年。上面代码中橙色的部分是函数的定义,绿⾊的部分是函数的调⽤。那如果我们将函数的定义放在函数的调⽤后边,如下:会报警告:这是因为C语⾔编译器对源代码进⾏编译的时候,从第⼀⾏往下扫描的,当遇到第7⾏的函数调⽤的时候,并没有发现前⾯有的定义,就报出了上述的警告。
2026-02-12 00:14:26
935
原创 每日代码(1)
这里我们要充分利用数组升序这一条件,可以让两个数组的元素从左到右比较:让两个数组的下标为0对应的元素比较,较小的元素打印到屏幕并且其下标加1,然后继续与之前比较结果较大的数作第二次比较,这里我们可以用一个循环语句来实现。当i=1时,打印的对象是第一列,内层循环的循环变量j依次将第j行的元素按行打印出来,以此循环,直达i=m后结束循环。输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。,因为原先的行数变成列数,原先的列数变成行数。
2026-02-08 14:38:39
750
原创 Day5数组
值得注意的是,变长数组的含义是指可以使用变量来指定数组大小,程序会根据运行时变量的值确定数组元素数量,而非指数组大小可以动态调整。可以看出二维数组初始化是从左到右一行一行的初始化,如果第一行的元素个数满了就转到第二行初始化,直到所给的初始值或所有行的元素全部用完。以后在代码中需要数组元素个数的地⽅就不⽤固定写死了,使⽤上⾯的计算,不管数组怎么变化,计算出的数组⼤⼩也跟着着变化了。有了前⾯的知识,我们其实使⽤数组基本没有什么障碍了,如果我们要深⼊了解数组,我们最好能了解⼀下数组在内存中的存储。
2026-02-06 16:48:20
967
原创 Day4分支和循环(做游戏)
这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的是依赖编译器上实现的,但是⼤部分编译器上是32767。我们可以看到虽然⼀次运行中产生的5个数字是相对随机的,但是下⼀次运行程序生成的结果却和上⼀次⼀模⼀样,这就说明有问题。之所以前面每次运行程序产生的随机数序列是⼀样的,那是因为rand函数生成随机数的默认种子是1。上面的代码充分体现了在种子一定的时候,重复循环rand函数,所得的输出值也是不同的。如果再深⼊了解⼀下,我们就不难发现,其实rand函数生成的随机数是伪随机的,
2026-02-05 00:57:06
812
原创 Day3分支和循环
C语言是结构化的程序设计语言,这里结构指的是顺序结构,选择结构,循环结构,C语言是能够实现这三种结构的。比如使用ifswitch实现分支结构,使用forwhiledo while实现循环结构。
2026-02-03 22:21:44
565
原创 Day1 C语言常见概念
C语言中有一些被保留的名字的符号,例如int ,if,return,这些符号被称为保留字或者关键词。关键字都有特殊的意义,是保留给C语言使用的,因此程序员自己在创建标识符的时候是不能和关键字重复的。关键词也不能自己创建。C语言常见关键词如下图。
2025-12-13 22:53:25
978
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅