自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 队列的实现(一篇包懂)

入队列需要空间,所以malloc一个节点的空间,将这个节点的值初始化为用户输入的x,并将该节点的next置空,以为这是尾插,尾节点的next为NULL。释放之后,要记得置空,其次不要忘记tail也要置空,因为只有一个节点的时候,head和tail指向同一个节点,你不置空tail,那么它就变成了野指针。再判断是否为第一次入队列,tail为NULL就代表该队列才刚刚初始化,所以就是第一个入队列,所以将head和tail都指向第一个节点。,这两个指针会指向队列中的节点,这种方式和其实就是哨兵位的另一种书写方式。

2024-05-22 19:05:43 313

原创 栈的实现(一篇包懂)

指向的是数组中下一个可插入元素的位置。如果用a接收,那realloc开辟失败,a如果之前不是空栈,那之前的栈元素也会丢失,而用一个tmp去接受,再去判断是否开辟成功会更好的保护数据。因为top的值和元素的个数一致,top一开始为0,入栈一个就top+1.出栈一个就top-1,所以直接返回top即可。让top--即可,因为top指向栈顶,这样如果下一个要入栈,根据入栈函数,它应该去占用之间4占用的空间。将x赋给a[top],因为top指向栈顶,它的值等同于元素的个数,top为下标就代表栈顶的后一个空间。

2024-05-22 15:46:38 527

原创 随机链表的复制 的讲解与实现

因为cur的下一个节点是复制节点,这样才能实现复制节点的random指向对应的复制节点的random ,每一次copy指向的节点都对应着cur指向的节点,所以,copy的random要和cur一致,但是一致要体现在复制节点上,而不是原节点,这样才能形成新的链表。2:进入循环创建了cur的下一个节点:next节点,然后结尾cur变成了next,从而向后移动,再次进入循环,next又借助新的cur向后移动。在原链表的每个节点后面,复制并链接一个节点,该节点的值和原链表的节点一致。1:因为题目要求新的链表由。

2024-05-20 14:30:47 281

原创 双向链表(双向带头循环)的增删查改的实现(简单易懂)

每个节点除开存有数据,还有一个指针指向前一个节点,一个指针指向后一个节点,尾节点和哨兵位互相指向,从而形成一个循环。当只有哨兵位的时候,first也就是哨兵位,以上的步骤依旧可以正常的头插,所以不需要额外增加情况的判断。参数为phead的,一定需要断言,因为不管该链表是否存在节点,都不会为空,因为最少也存在哨兵位的节点。当只有哨兵位的时候,tail也就是哨兵位,以上的步骤依旧可以正常的尾插,所以不需要额外增加情况的判断。尾插一个节点进来,不但要进行尾节点和尾插节点的循环,还要进行尾插节点和哨兵位的循环。

2024-05-12 21:12:23 814

原创 环形链表(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的原理讲解

由情况1可知,在slow进入环之前,fast在环内走的长度一圈都没有,在slow进入环后,fast开始追赶,最后走了一点距离,追上了slow,此时fast在slow进入环之前在环里走的距离+在slow进入环之后在环里追击所走的距离= 一圈,所以n的最低取值为1。情况2:a指针从相遇点开始走到和b指针在入口点相遇的时候,a指针在环内走了 C - X + (N-1) * C ,走了N-1圈 ,然后再走了C - X 的长度。由上图可知,slow走的距离为L+X,fast走的距离是L+C+X,

2024-05-12 17:04:39 879 1

原创 环形链表(判断链表中是否有环)的讲解

3:当slow和fast遍历的时候,如果fast和slow相等,就代表该链表带环,因为以上两种情况slow和fast永远不会相等。fast->next指针为空,代表这是一个奇数个节点的链表,fast1,3,5这样的移动,最后一次会到尾节点,所以它的next为空。fast指针为空,代表这是一个偶数个节点的链表,fast1,3,5这样的移动,最后一次会到尾节点的下一个节点,所以fast为空。而相等只会出现在slow和fast指针两个都进入了环,彼此开始进行追击,总有一个节点,二者会相遇,即slow=fast。

2024-05-12 15:33:33 159 1

原创 相交链表(给你两个链表,找出它们的第一个公共结点)的实现与讲解

那为什么不while(curA) 呢,这样lenA就是正确的,因为下面的尾节点比较的时候,curA和curB已经来到了尾节点的后一个节点,这样的话无法比较尾节点,除非在计算长度的时候,还要保留前一个节点的指针,这样比较麻烦,所以宁愿lenA,lenB赋值为1.让长的那一条链表先走长度的差距,这样会距离交点的距离相等,然后再对两条链表的节点对应着去比较。长度的差距一定是在相交节点之前就决定了的,因为相交节点之后的链表完全相同。,因为,一但有一个相交节点,比如图中的c1,那之后的链表一定是一致的,

2024-05-10 17:04:39 130

原创 切割链表 问题的讲解和实现(带哨兵位)

链接完成后的链表的最后一个节点的next一定要置空,因为该节点在一开始的链表中的next是有指向的,而他是最后一个,它的指向没被改变,有可能会造成死循环,成环!需要注意的是:ltail这个尾节点连接的ghead的下一个节点,而不是ghead这个节点,因为两个链表的哨兵位是我们创建的,后面都会被释放。两个链表拼接到一起的新链表的头指针,不是哨兵位,而是哨兵位的下一个节点,因为题目给的链表不存在哨兵位,哨兵位只是我们方便自己进行操作。将小于x的放进一个新的链表,将≥x的也放进另一个新链表。

2024-05-10 15:53:11 171

原创 合并两个有序链表的两种方法(带哨兵位和不带哨兵位)

当一个链表比较完了之后,就没必要进行比较了,此时,另一个链表的剩余部分怎么处理,很简单,直接让排完序的那个链表的尾指针指向这个链表的剩余部分即可,因为剩下的都是大于排好序的链表里面的每一个的,而且剩余的自己也有顺序,所以直接链接即可。两个链表的对应节点进行比较,然后取小的尾插,直到某一个链表为空,再把剩下的不为空的链表链接过去即可。应先对传过来的两个链表中存在空链表的情况,率先进行处理,list1为空,return list2,反之。

2024-05-08 14:18:25 483

原创 返回链表的中间节点题目讲解(超快方法)

1:slow指针一次跳一个节点,fast指针一次跳两个节点,这样当fast到尾节点的时候,slow刚好到中间节点,但是奇数个的时候,fast不会刚好的停留在尾节点,而是会越过尾节点,但是此时的slow指针依旧是指向中间节点的。所以while的判断条件是;fast && fast->next,分别针对奇数个节点和偶数个节点。采用快慢指针方法来解决。

2024-05-08 13:42:28 160

原创 反转链表题目讲解(最快的两种方法)

采用三指针方法,n1,n2,n3,n1和n2负责反转,n3负责找到下一个(因为反转之后就无法找到下一个)到n2为空的时候结束,这时候代表最后一个节点也已经进行了反转。n2指向n1,此时节点1和节点2的链接断开。

2024-05-08 13:27:35 135

原创 移除链表元素题目讲解

创建两个指针prev和cur,初识位置cur为头指针,prev为NULL,然后两个指针往后移动开始去寻找与val值吻合的节点,最后找到节点的时候,cur指向该节点,prev指向该节点的前一个节点,现在我们的目的是要删除这个cur指向的节点,让cur去指向该节点的下一个节点!所以我们先将prev的next修改为该节点的下一个节点,将该节点的前后两点链接起来(prev->next = cur ->next)然后再让cur指向该节点的后一个节点(cur=prev->next )。

2024-05-08 12:03:15 431

原创 合并两个有序数组题目讲解

取三个位置,第一个end1位置为nums1数组有效值的最后一个(第m个元素,下标为m-),第二个end2是nums2数组的最后一个元素(第n个元素,下标为n-1),这两个位置,倒着比较,较大值就储存到nums1中最后的位置(end),如果相等取nums2和nums1到end去都一样,这样每次比较的较大值就从nums1数组的最后面依次往前插入。end和end2都往前移动一个位置,然后end1和end2比较,结果是end1大,所以end变成了end1。[1,2,2,3,5,6] ,这就是非递减顺序。

2024-05-08 10:58:57 262

原创 单链表(无头单向非循环)的增删查改的讲解与实现(一篇包懂)

让tailprev指向倒数第二个节点(尾节点的前一个节点),然后释放掉tail指向的尾节点,然后把tail置空,最后把tailprev(指向倒数第二个节点)的next置空,因为此时倒数第二个节点就是尾节点了,尾节点的next应该为NULL。头删就是让头指针去指向原本头指针指向节点的下一个节点,然后再去释放掉第一个节点的内容,而为什么不直接用*pphead(plist)去进行操作,因为这样释放的时候会释放掉操作后头指针指向的第二个节点,所以需要将头指针保存到新变量newhead中,这样才能完美的完成操作!

2024-05-05 22:01:22 585 1

原创 顺序表的增删查改的实现以及讲解(一篇包懂)

1:断言:,不仅是对接收到的结构体指针进行断言,还是对pos的值进行断言,pos应该处于0~size-1之间,也就是>=0,<size,超过这个两端,就越界了。1:断言:,不仅是对接收到的结构体指针进行断言,还是对pos的值进行断言,pos应该处于0~size-1之间,也就是>=0,<size,超过这个两端,就越界了。1:断言:,不仅是对接收到的结构体指针进行断言,还是对pos的值进行断言,pos应该处于0~size之间,也就是>=0,<=size,超过这个两端,就越界了。capacity已经在。

2024-05-01 21:00:53 896

原创 递归实现斐波那契数列的空间复杂度的讲解

到左下的Fib(2)的时候,此时不同的Fib栈空间个数达到了最大,也就是n个栈空间,然后就会往回递归,并且往回递归的过程中还是重复利用之前的栈空间,所以空间复杂度应该是O(N)!),此时的Fib(1)会使用之前Fib(2)的栈空间,而不是额外的新的栈空间,然后Fib(1)达到了if的限制条件,然后回到了Fib(3)(此时的Fib(3)完全执行完毕,和最下面的Fib(2)执行完毕一样,此时执行完毕的Fib(3)会返回到上一级的Fib(4)(),然后Fib(2)执行完毕返回到上一级的Fib(4)(

2024-04-24 20:54:29 134

原创 冒泡排序的时间复杂度的讲解

遍历了n-1,n-2,n-3......才让数字来到该处于的位置,而这是一个等差数列(n-1,n-2,n-3......),该数列,首项为1,尾项为n-1,求和后,最大的影响项是n^2/2,所以时间复杂度为。最好就算是进来就是有序的,但是呢,它也得通过一遍的遍历才知道是否是有序的,所以还是n-1次,所以时间复杂度为O(n),而不是O(1)!只有两个数位置不对,就是n-1+n-2,也就是2n-3,也就是O(n)综上所述:时间复杂度为:O(n^2)。

2024-04-17 18:41:50 178

原创 二分查找的时间复杂度的讲解

所以x=log以2为底N的对数,简写成logN,在复杂度里面只有以2为底的可以简写,但是和数学里的lgN,没有任何的联系!因为最坏情况就是找不到和查找区间只剩一个值的时候,所以此时数据的个数就为1。综上所述:二分查找的时间复杂度为O(lgN)。由图可知:查找了多少次,就除了几次2。

2024-04-17 18:36:52 200

原创 消失的数字的两种巧妙方法

0^3然后去^下一个数,结果下一个数是4,3消失了,所以大致的流程变成了0^3(上面for循环没有消失的3)^4(下面for循环的3消失了,所以是4)^4(接着就是上面个for循环的4)^5v5.....,所以我们最后的x就变成了那个消失的数字,因为0^3^4^4^5^5就等同于0^3^0^0,也就是3。所以我们可以知道,如果两次for循环,x都面对同一个数,它会先变成这个数(0^a=a),然后再变成0(a^a=0),所以如果上下循环的数是同一个,x经过变换还是0。

2024-04-17 18:28:38 208

原创 scanf/fscanf/sscanf和printf/fprintf/sprintf的使用和对比

如果发生写入错误(例如,磁盘空间不足、文件无法访问等),则“错误指示器”(ferror)会被设置,并且函数会返回一个负数。它可能返回成功处理或填充的参数数量,这个数量可能与预期的数量相匹配,也可能更少。: 当尝试匹配某些内容(例如,从输入中查找特定的模式或字符串)时,可能会失败。: 如果函数试图读取文件,并且已经到达了文件的末尾,那么它将停止读取,并且返回的项目数量可能会少于预期。这个数量可能与预期的项目数量相匹配,但由于匹配失败、读取错误或达到文件末尾,它也可能更少(甚至为零)。

2024-03-30 16:03:09 812 1

原创 八种顺序读写函数的介绍(fput/getc;fput/gets;fscanf,fprintf;fwrite,fread)

(fput/getc;fput/gets;fscaf,fprintf;fwrite,fread)的使用介绍

2024-03-28 22:53:15 1094

原创 动态内存函数开辟的经典的笔试题

动态开辟内存忘记释放(内存泄漏)(一般是在某个函数中进行开辟,然后回到主函数,无法使用开辟的空间,导致泄露)(动态申请的内存空间,不会出了作用域就自动销毁(还给操作系统),只有free,或退出程序才能还给操作系统)。1,数组的创建,出作用域会销毁这个数组的内容,str的确指向了这个数组,但是已经变成了野指针,因为指向的空间已经不属于它了。: p的移动,导致了free的时候,不能够完全释放掉malloc开辟的全部内存。1,p只是str的一份临时拷贝,无法让str改变,因为采用给的是值的传递。

2024-03-27 15:25:59 208

原创 几种动态内存函数的理解(malloc,calloc,realloc,free)

函数的出现让动态内存管理更加灵活,有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址。1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化,返回的是增加前的空间的首地址。

2024-03-27 14:58:25 794

原创 通讯录的模拟实现(增删查改,清空,排序)

联系人结构体要满足题目要求,另外我们还要创建一个通讯录结构体,其应该包含多个联系人结构体(联系人结构体数组)和联系人人数(sz),因为后面增加删除,以及联系人的访问都会用到sz,其次对几个重要变量的重定义,以后方便修改,不用去到处找修改的变量在哪里。text.c(大纲)的意义在于,明确整个程序的思路,程序开始,创建了一个通讯录,并且对其初始化为0,然后我们再让用户进行选择需要实现的功能,用switch case语句来实现多种功能。拥有增加,删除,搜索,修改,展示(所有联系人),退出功能。

2024-03-23 19:47:34 511 2

原创 如何用联合(共用体)union验证系统大小端

由联合体的特点,可知上图,char c 和 int i 共用四个字节,假设是小端,则由左到右是低地址到高地址,四个字节的内容如图所示01 00 00 00。如果第一个字节是1,则证明是小端,因为小端是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地。

2024-03-22 15:09:37 339 1

原创 计算联合体union的大小

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联。是最大成员的大小,也就是c数组的大小14,所以联合体最终的大小为离14最近的4。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。是最大成员的大小,也就是c数组的大小5,所以联合体最终的大小为离5最近的4。所以Un1中c的对齐数是1,i的对齐数是4,所以最大对齐数是4,目前。所以Un2中c的对齐数是2,i的对齐数是4,所以最大对齐数是4,目前。的倍数,也就是16。

2024-03-21 17:00:28 421

原创 计算结构体的大小(结构体的内存对齐)

3,c2本身大小为1,而vs默认对齐数是8,所以1和8,进行比较,较小值为1,所以对齐数为1,那c2就要去找1的倍数处的地址(图中右边的数字),任何一个数都是1的倍数,所以就选择了紧接着i的红色格子。而c1和c2和i的对齐数中,最大的是4,所以结构体大小应该是4的倍数,因为此时结构体已经9个字节了,最近的符合规则的就是12,所以又往下浪费了3个字节。嵌套的结构体这个整体要对齐到自己的最大对齐数(也就是它内部元素的最大对齐数)的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

2024-03-21 16:36:05 290

原创 秒懂memmove的模拟实现

就是按照8,7,6,5,4的顺序复制给5,4,3,2,1,无法得到4,5,6,7,8,6,7,8,9,10(正确)而是得到7,8,6,7,8,6,7,8,9,10。,就是按照4,5,6,7,8的顺序复制给1,2,3,4,5,可以得到4,5,6,7,8,6,7,8,9,10(正确),就是按照4,5,6,7,8的顺序复制给6,7,8,9,10,可以得到1,2,3,4,5,4,5,4,5,4。,就是按照8,7,6,5,4的顺序复制给10,9,8,7,6,可以得到1,2,3,4,5,4,5,6,7,8。

2024-03-20 16:33:36 780 2

原创 memcpy的模拟实现

void* 类型的指针,不能进行指针运算和指针解引用,所以我们要将其进行强转之后再进行运算和解引用,那我们选择的强转的类型就是char*,逐字节的复制,会适用与多种类型指针的复制。因为返回的是dest指向的首地址,而dest指向的地址在复制的过程之中会被改变。3,因为不知道我们的源头数组和目的数组的类型,所以均用void * 来接收和返回,size_t num则是确保了复制的字节数是正数。的理解在于进行逐字节的复制,而num就是我们要复制的字节数,刚好作为循环条件。的内存位置,然后返回目的数组的起始地址。

2024-03-20 14:40:28 337

原创 字符串的左旋讲解

作用在于对于大于字符串长度的左旋,会%后再进行左旋,避免错误,左旋ABCDEFn个字符,代表左旋一个字符循环n次。将总体字符串BAFEDC再进行逆序,得到CDFEAB。a.先把第一个字符,用临时字符变量存起来。ABCDEF的左旋可以分为三步,以左旋。c.最后再将第一个字符赋给最后的字符。将后面剩下的字符逆序得到FEDC。b.然后后面的依次向前移动一个。要左旋几个字符,就循环几次即可。比如左旋7,其实就是左旋1。将前两个字符逆序得到BA。

2024-03-19 23:51:42 218

原创 杨氏矩阵的查找(复杂度<O(N))

如果n<它,代表最后一列也不用找了(因为它是第三列(最后一列)里面最小的)如果n>它,代表最开始一行已经不用查找了(因为它是第一行里面最大的):n>关键数,最开始一行不用找了,行+1。:n<关键数,最后一列不用找了,列-1。经过对行和列的不断变换,最终会找到n。被查找的数(n)与关键数进行比较。先找到一个最关键的数字,

2024-03-19 22:54:25 197

原创 strstr的模拟实现

所以我们要将str1和str2分别赋给一个新的字符指针,如图中的cp和s2,然后再将cp赋给s1,因为我们遍历比较的过程中,str1需要一个指针去遍历比较(s1),一个指针去指向某个可能首次出现str2位置(cp)。如果*s2为'\0'的时候,就代表已经在str1中找到了str2,因为不把s2的全部字符遍历完,不可能来到s2的'\0'。因为比较的过程中str1中的cp会因为比较的结果(比较不吻合)向后移动,当cp移动到最后一个字符'\0'的时候,也就代表再也在str1中找不到str2了,所以退出循环。

2024-03-17 21:32:02 510

原创 strcmp的模拟实现

因为e的ascll码值<f的ascll码值 ,返回小于0 的数子-1。因为两个字符串中对应的字符相等,所以一个不为'\0',另一个也不会。返还出正负或0值,直接return前者和后者的ascll码值即可。两个字符串中对应的字符相等就进入循环,否则肯定可以比较出大小。比较两个字符串的大小(按照字符串中字符的ascll码值)。第一个字符串大于第二个字符串,则返回大于。第一个字符串小于第二个字符串,则返回小于。断言是否为空指针,在考虑是否进行下一步。第一个字符串等于第二个字符串,则返回。

2024-03-15 21:02:32 313

原创 strcat的模拟实现

因为strcat返回值为拷贝后的目的数组的首地址,所以在函数内部一开始进行一次首地址的保留(char* start = dest;),因为之后首地址会改变。断言语句起到严谨的作用,先判断是不是空指针在考虑是否进入下一步。第二个while语句,简单,将赋值,判断,++,一气呵成。先找到目的数组中的 '\0' ,然后从 '\0'开始追加。目标空间必须有足够的大,能容纳下源字符串的内容。将源字符串追加(连接)到目的字符串的后面。然后返回目的数组的首地址(start)。进行最后一步 \0 的赋值。

2024-03-14 22:49:26 228

原创 strcpy的模拟实现

while语句先进行赋值(不管是不是\0,因为\0也需要赋值),然后判断赋值的结果是不是\0,因为\0 的ascll码值就是0(如果是的话,已经把\0赋值成功了,并且退出循环),然后进行后置的++,一气呵成。因为strcpy返回值为拷贝后的目的数组的首地址,所以在这里进行一次首地址的保留,因为之后首地址会改变(char* start = dest;源字符串第一个元素不是 \0 ,就进入循环,然后进行赋值,赋值完成后,地址双双往后移。返回值为拷贝完成后的目标数组的首地址。进行最后一步 \0 的赋值。

2024-03-13 21:28:53 286

原创 C语言打印菱形(三分钟教会)

line代表上半部分行(7行包括最中间那一行),所以上半部分为line(7)行,下半部分为line-1(6)行。这个菱形上半部分7行,下半部分6行。

2024-03-11 22:50:23 218

原创 数组名结合指针的面试题的讲解

这一步,aa为数组名,现在代表数组首元素地址,也就是一维数组1,2,3,4,5的首地址,然后+1.此时指向了第二个一维数组6,7,8,9,10的首地址,此时aa+1的类型是int(*)[5],然后就是对一个数组指针进行了解引用,所以结果是一个一维数组,然后又因为一维数组名代表首元素地址,也就是第一个元素6的地址,类型为int*,所以此时题目的将int*强转成int*是没有意义的,然后。(%p),是将-4以%p的形式打印,%p没有符号之分,直接将-4的补码以16进制进行打印。

2024-03-11 15:10:03 740

原创 数组名的理解,看这一篇就够了!!!

a[0]是这个一维数组的数组名,该数组名当单独放在sizeof中(sizeof(a[0])),或者前面&的时候(&a[0]),满足那两个条件,其所指的整个数组是它所对应的那一行数组,比如a[0]这个时候就代表第一行数组,a[1]这个时候就代表第二行数组.......现在对其进行+1-1,会以一行数组作为单位来跨越。a[0]作为第一行的数组名,没有单独放在sizeo内部,没有&,a[0]表示数组首元素的地址,也就是a[0][0]的地址,所以a[0]+1是第一行第二个元素的地址,是地址就是4/8个字节。

2024-03-10 20:35:58 763

原创 qsort函数的模拟实现

qsort函数会自己在比较大小之后去进行数组里面元素的位置的调换,而我们模拟实现要解决的就是这个问题,所以我们要自己创建函数去进行元素位置的调换。我们采用冒泡排序法来构建主题。

2024-03-09 21:40:47 176

原创 qsort函数的用法及参数的讲解

第四个参数,因为我们自己创建的比较整形的函数是 cmp_int,所以我们的传参传的就是cmp_int,函数名就是函数地址,所以和qsort函数的定义中的第四个参数为函数指针刚刚匹配,正好用函数指针来接收函数的地址(函数名)。指向一个比较两个元素的函数的指针(函数指针),这个函数将被qsort反复调用以比较两个元素,这个函数指针指向的函数,能够比较base指向数组中的两个元素。综上所述,所以我们要将void*强转为我们需要的指针类型,然后再解引用,才能得到我们所需要的数据。第三个:size_t size。

2024-03-09 19:36:47 665

空空如也

空空如也

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

TA关注的人

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