- 博客(31)
- 收藏
- 关注
原创 【C语言】动态内存管理
所以str的值根本就不会发生改变还是NULL,而我们知道strcpy的函数实现是需要对实参的地址解引用的,所以这里会对NULL解引用,会出现错误。● 有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时 候内存,我们一定会对内存的大小做灵活的调整。● 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大 小,以适应柔性数组的预期大小。其实是不行的,因为这个数组是在函数里面创建的,这个函数的栈帧已经销毁了,数组也被销毁了,
2023-07-28 19:00:14
889
19
原创 【C语言】位段枚举联合
我们画图简单的表述一下就知道了,这就是共用的意义。那么我们可以合理的想象,如果c变量中放了一个值,如果再在i变量中放一个值是不是就会把c变量的值改变呢?以上定义的 enum Day , enum Sex , enum Color 都是枚举类型。这些可能取值都是有值的,默认从0开始,一次递增1,当然在定义的时候也可以赋初值。● 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。我们尝试打印一下联合体的地址,以及c变量,i变量的地址。{}中的内容是枚举类型的可能取值,也叫 枚举常量。
2023-07-27 18:06:11
659
37
原创 【C语言】结构体与offsetof实现
不是所有的硬件平台都能访问任意地址上的任意数据的;(比如只能访问4的倍数的地址上的数据)总体来说: 结构体的内存对齐是拿空间来换取时间的做法。不行 首先这个匿名结构体,重定义为Node,但是重定义之前,就定义了Node*next,都是同样的结构体成员,但是把小的放在一起就节省空间 (这是上面讲过的)。之后的成员要放在正确的偏移处。其实offsetof是用宏来实现的,与一般的函数不同。这个宏是用来查看结构体成员的偏移量的,并返回偏移量值。我们看到实际上偏移量就是该变量的地址的值减去首地址。
2023-07-22 18:23:55
648
42
原创 【C语言】指针数组测试题(1万字长文)
sizeof(a[0] + 1):a[0]作为第一行的数组名,并没有单独放在sizeof内部,也没有被取地址,按上面的分析方法a[0]代表第一行的数组名也是第一行的地址,所以a[0]就是数组首元素的地址,就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址,是地址那么在。:首先我们拆解一下,* (*(cpp-2))+3,首先cpp-2,但是不是永久的,然后再解引用,上面我们cpp指向的是下标为2的位置,现在应该指向0,解引用得到c+3,再解引用得到F的地址,F的地址+3得到。
2023-07-18 17:51:21
707
64
原创 【C语言】回调函数(qsort)与模拟实现
可以看到我们用char *来接收这两个地址,目的就是让字节让字节和字节交换,比如说一个结构体数组的一个元素的大小是20字节,那么我用字节为单位与另一个元素交换20次不就行了吗?我们已经学习完qsort函数了,我们知道qsort函数其实是用快速排序实现的,虽然我们没有学过快速排序,但是我们知道冒泡排序。(compar就是一个函数名,当qsort的参数里包含另一个函数的名字,就与我们说的回调函数相符)我们需要传的参数其实就三个,元素1的地址,和元素2的地址,最后是元素的大小,为什么要这样做?
2023-07-14 15:14:59
560
66
原创 【C语言】指针进化:传参与函数(2)
我们传参传的还是首元素的地址,首元素地址,可以用一样的类型来接收,就想上面我们说的一样。p1和p2都是存储Add函数的地址,而函数名就相当于函数地址(p1 | p2 == Add),那么解引用实际上有没有都一样,哪怕你写(********p2)都行,并没有什么太大的意义。二级指针我们知道,是用来接收一级指针地址的(注意指针变量的地址不要与指针变量中存储的地址搞混淆),那么一级指针地址有几种表示方法呢?,整型指针一般接收整型元素的地址,我这里可是二维数组的第一行的地址,即一个一维数组的整个数组的地址。
2023-07-11 22:19:14
577
55
原创 【C语言】指针进化 !!!
我们想一下,在我们传参的时候,arr数组名就是用char * 来接受的,为什么呢?我们知道p1 ~ p5 存储的就是对应的abcde的地址,而类型决定应该放什么元素,而这里指针数组是字符指针数组,所以类型就是char *.值存在ch中,然后用 p这个指针变量存放ch的地址,通过给解引用p赋值,成功改变ch中的字符由’ w ‘变成’ a ’— 出自《淮南子·说山训》p2 优先结合说明是一个指针,然后确认指针类型,是int [ 10 ],也就是数组指针。那么指针数组就比较明显,肯定是存放指针的数组。
2023-07-09 21:15:45
405
26
原创 【C语言】你知道浮点数是怎么存储的吗?
因为 2^-126次方已经非常小了,相当与趋近余0,地球离月球的距离约为2的28.8974次方,这样对比就知道2 ^-126 有多小了吧。这样的数需要很多小数点后的1来表示,但是我们计算机只会保留部分,所以会导致精度丢失,但是没有办法,所以我们才会四舍五入。这篇博客将会详细介绍浮点数的存储,我们在很多教材上是学不到的,所以我们会对浮点数的存储产生好奇,今天我们就一起来学习。,但是int 类型的变量n呢?会改变这两个变量里的数据,那么float *类型的是比较容易改变的,会被直接改变变成。
2023-07-09 09:40:46
1023
40
原创 【C语言】大小端介绍以及判断大小端的两种方式
解释:在花繁叶茂、柳密如织的美丽和复杂情境下,如果还能不受束缚,来去自如,才是有手段、有办法的人。在狂风骤雨的狼狈状态下还能站稳脚跟,不被吹倒,才是真正有原则的大英雄。我们先取地址a,然后强转为(char *)类型,这样我们解引用的范围就是一个字节了,然后就更上面的方法一样的,确实妙啊。将数据的高位存放到内存的低地址 ,数据的低位存放到内存的高地址。类型的指针指向a,或者说把a的地址放到str变量中,为什么是。花繁柳密处,拨得开,才是手段;将数据的高位存放到内存的高地址,数据的低位存放到内存的低地址。
2023-06-30 21:50:20
3075
12
原创 【C语言】整型在内存中存储 赛场(来试试)
解释:合抱的大树,生长于细小的萌芽;极高的高台,筑起于每一堆泥土;千里的远行,是从脚下第一步开始走出来的。上面就是无符号int的大小值,那为什么0 -1会变成4294967295,下面这幅图也应该能够解释。我们看我以前画的这幅图,当i = 255后 再+ 1就会再变成 0 也就是说会变成一个死循环。这篇博客我们将会讲解一些整型在内存中存储的题目,可以来试试自己的理解是否到位。如果是新手肯定会有点蒙不知道是什么意思?这是我们调试得出的结果为什么呢?如果你实在不能理解我就来告诉你。最后打印出来的是什么呢?
2023-06-29 22:47:56
1404
3
原创 【C语言】杨辉三角和练习
我们将它看成是一个二维数组,那么打印1的位置只有列为0的时候 和 行和列相等的时候,也就是我们说的对角线。解释:此两句为现代读者合用。君子在独处时,即使别人看不见、听不见,也要谨慎不苟。这篇博客我们一起来学习杨辉三角的解题方法,然后再拿出两个相似思路的题目来练习。如果本文有任何错误或者有疑点欢迎在评论区评论。希望能通过写博客加深自己对于学习内容的理解。这道题其实只要点出思路就比较简单了。也能帮助更多人理解和学习。君子慎独,不欺暗室。我们依然讲的清晰一些。
2023-06-28 22:26:44
1532
1
原创 【C语言】从水仙花构建思维
我们肯定是在 0-100000这个范围里面循环,我们再想一想之前我们判断三位数的时候是怎么做的,用pow(base,exponent),base是底数,exponent是幂,我们的base很好变化,那么我们的幂怎么决定呢?这篇博客我们一起来学习一下有关于C语言中常见题目水仙花的思维,这对我们刷题时有一个清晰的思路很有帮助。我们来看看这个题就明显可以用我们上面的pow函数,当然思路也不算太难,主要是要学会运用。我们看题目,“水仙花数”是一个n位数,其各位数字的n次方等于该数本身。— 唐代·孟郊《劝学》
2023-06-27 20:43:07
1918
3
原创 【C语言】左旋字符串解题思想
这篇博客我们一起来学习字符串左旋,这也是C语言中比较常见的题目,如果我们能学会今天的方法与思想,基本上你看到这种题目就不再感到棘手,如果说你本来就会那么不妨看看,说不定能让你的思路更加通畅。那么如果我们需要左旋的数量是k的话,那么在我们left_rotate这个函数最外层while的循环次数也就是k% len。我们可以想一想,左旋实际上就是1,2,3,4这几种可能。这就是我们的思路,将A字符放到字符串最后,然后让A之后的字符串都向前移动。所以我们计算了strlen(arr)的长度,也就是字符的长度。
2023-06-26 22:33:52
1352
3
原创 【C语言】字符串逆序与三步翻转法(倒置字符串)
还有如果gets无法使用时gets_s使用的细节,gets_s会补\0在输入的字符串后,所以我们要注意输入的字符长度不要超过gets_s的参数的数字。我们知道strlen函数,可以求\0之前的字符个数,可以利用这一点来确定right指针的位置。所以我们让还在指向space的str2++,但是这个str2还是有条件,当到字符串最后的时候。我们直接用一个cur指针来接收str2-1的值,也就是指向space的前一个字符。str2肯定就会指向\0,所以我们也要加限制条件,不然就会越界访问,形成野指针。
2023-06-25 22:43:41
3618
3
原创 【C语言】函数栈帧的创建和销毁
这里也一样,把esp的地址赋给ebp,也就意味着,ebp指向的位置改变了,但我们之前说这个ebp不是栈底指针吗?这里就很明显的能看出特点,我们看到main函数是在Add函数的下面,也就意味着Add函数是后调用的,那么main函数下面还有一个函数,叫main。执行到这条指令时,程序流会跳转到函数的起始地址,并将当前指令的地址保存在堆栈上,以便在函数执行完毕后返回到正确的位置。这里还有一个重要到底知识点,esp和ebp是用来维护函数栈帧的,也就是说,现在在调用哪个函数我esp,ebp就维护哪个函数的函数栈帧。
2023-06-24 21:52:35
488
10
原创 【C语言】数据类型的大小(没有浮点)
也就是说如果signed char 类型的变量是127,+1后就会变成-128。0~255 一共256个数就是unsigned char的大小。有符号和无符号的大小我们会详细的讲到。如果本文有任何错误或者有疑点欢迎在评论区评论。希望能通过写博客加深自己对于学习内容的理解。char 的大小的详细讲解🍊。char 的大小的详细讲解🍊。我是一名普通的博客写作者。然后我们再给大家一张图。int大小的详细讲解🍊。
2023-06-19 22:29:24
143
3
原创 【C语言】求二进制中1的个数(三种方法)
该方法也是与其他两种方法拉开水平的一种,如果你想让别人感觉你对二进制位理解的很到位,你就可以写这种方法。=的优先级是高于&的所以要加(),那也就是说我们直接写成。因为2的二次幂的二进制中只有一个1,所以,只二进制中只有1个1的时候才能说明是2的2次幂。我个人还是比较推荐移动所求数的二进制位,因为得出来的结果只可能是1或0;那么通过不断的左移,如果左移后&的结果不为0就说明有一个1,如果说我们能让1左移1位就能得到二进制的第二位是多少,然后其实我们也可以直接移动i的二进制位,不断的右移。
2023-06-17 22:06:24
1332
1
原创 【C语言】操作符
移位操作符🍊前言🎈大家好,我是何小侠🎈🌀大家可以叫我**小何或者小侠🌀**🔴我是一名普通的博客写作者🔴💐希望能通过写博客加深自己对于学习内容的理解💐🌸也能帮助更多人理解和学习🌸🍃我的主页:🍃这篇博客我们一起来学习C语言中操作符的一些理解和技巧,可能不会涵盖所有操作符,但是应该会让你有所收获。
2023-06-09 16:47:18
83
1
原创 【C语言】青蛙跳台阶(两种青蛙跳)
我们还是把我们的分析写成表格更好大家理解。因为我们已经换了一直青蛙了,就那4 阶数举例吧。青蛙先跳1级剩下的就是f ( 3 )种跳法,先跳2级就是f ( 2 ),······最后就是直接从地面跳到终点就是 f ( 0 )就是 1种跳法。最后我们要推出这个递归条件!我们知道所以代码🍊。
2023-06-07 22:26:10
229
2
原创 【C语言】汉罗塔
印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面。这个代码如果你仔细去写出过程其实是比较麻烦的,因为我最近也没有太多时间所以我就不在这里实现了,我之前有看到有个同学写出来过,还是比较麻烦的。我们看到我们先讲小圆盘移动到B柱,再把大圆盘移动到C柱,然后再将小圆盘移动到C柱。这里有三个柱子,我们从左至右称为A柱,B柱,C柱。我们已经快接近规律了。
2023-06-07 18:57:41
262
4
原创 【C语言】扫雷(包括展开和标记)
/定义二维数组 char mine [ ROWS ] [ COLS ];······ }我们暂时先给出一点代码,避免干扰思路,注意看我们用的常量ROWS,和COLS来定义。这是我们在头文件用#define定义的,为什么我们还非要写ROW,和COL呢?因为我们有时候不需要操作整个数组,只需要操作9x9就行。然后是我们的初始化->//定义二维数组 char mine [ ROWS ] [ COLS ];
2023-06-04 22:44:20
553
5
原创 C语言 三子棋以及推广到n x n
int i = 0;for(i = 0;i < row;for(j = 0;j < col;j ++) {} } }这里的ROW COL 是我们在头文件中用#define定义的,因为我们要玩三子棋所以我们设置为3,3。之后我们会拓展一下,例如,在5x5的棋盘里面玩三子棋。
2023-05-28 19:00:02
520
3
原创 【C语言】关机程序及添加至服务(^_^)
现在这篇博客就结束了,大家可以利用这个关机程序去和自己的好朋友玩玩,但是不要玩的太过,要是他的电脑被搞坏了,不是说是我教的^_^关机代码🍊添加到服务(1)🍊添加到服务(2)🍊。
2023-05-23 19:57:34
255
3
原创 【C语言】一篇博客带你弄懂最大公约数和最小公倍数
我们在C语言的学习中,经常会遇到这样一些数学题目,良好掌握这些题目有利于我们理解和学习C语言,话不多说,直接进入主题首先我们举个例子,比如12 和16,12的约数有(1,2 ,3,4,6,12),16的约数有(1,2,4,8,16)公约数就是两个数共同的约数,(1,2,4)而公约数中最大的就是最大公约数。最小公倍数我们同样举个例子,比如12和16,我们将163=48,124=48,这是两个数第一次有倍数相等关系,就叫48是最小公倍数。
2023-05-20 17:20:01
7370
15
原创 【C语言】猜数字游戏(凸(艹皿艹 )超级超级详解)!!!
我们如何实现让结果全在1-100区间呢?只需要对rand()%100 +1就行,任何数%100就是0-99,0-99 都+1 就是1-100。这个大家可以理解理解然后我们就来实现猜数字。while(1) {printf("猜数字:>\n");printf("猜小了\n");printf("猜大了\n");} else {printf("恭喜你,猜对了\n");break;do {menu();printf("请选择->");
2023-05-17 17:09:16
516
3
原创 【C语言】在有序数组中查找某个特定的值(二分查找法)
在有序数组中查找某个特定的值,那我们就直接遍历整个数组就行了,这是最简单的一种方法这样的方法确实简单,但是效率比较低。接下来我们就进入重点我们介绍。
2023-05-16 16:26:27
287
3
原创 【C语言】scanf getchar gets函数详解,带你摆脱窘境
请大家看看下面的思维导图看完这个感觉新学的同学可能也不是太理解,我就随便讲一讲后两个,getchar: 这个函数是用来从键盘读入字符的,并且一次只能读一个,它也是可以读转义字符(\a \n \t 等)的,因为转义字符也属于字符。gets:这个函数可以简单理解为将字符串输入到一个字符数组里。它读取整行输入,直至遇到换行符,然后把换行符,储存其余字符,并在这些字符的末尾添加一个空字符使其成为一个 C 字符串。它经常和 puts()函数配对使用,该函数用于显示字符串,并在末尾添加换行符。
2023-05-15 16:02:52
2229
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人