自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 编译和链接

-------------------------------------------> 这个过程叫编译。源代码文件-----------------------------——-->怎么转换成可执行程序?test.c----------->怎么经过编译器的处理生成—————-> test.e//源文件 -----> 符号汇总 -----> 形成符号表 -----> 符号决议和重定位。4.链接:源文件----->符号汇总----->形成符号表----->符号决议和重定位。//因为是Linx环境后缀不同。

2024-05-30 15:15:04 645

原创 文件操作详解

一.为什么使用文件?如果没有⽂件,我们写的程序的/*数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失*/了,等再次运⾏程序,是看不到上次程序的数据的,如果要将/*数据进⾏持久化的保存*/,我们可以使⽤⽂件。程序运行的时候,对n的值输入20,程序结束下次再次运行起来的时候n的值还是为0。发现上次输入的值没有保存。因为创建的n在内存,输入的数据也是在内存,内存的数据一但程序退出,数据就还给操作系统了。所以数据放在内存中是非常不安全,不稳定的。除非程序一直不结束,你数据就一直在。

2024-05-04 13:19:54 672

原创 动态内存管理

一.为什么要有动态内存分配目前开辟内存有那些方式?二种:缺陷:这样申请的空间被固定死了,申请更大或更小的空间不行,除非把代码改了。问题:当你开辟好的空间小了,大不了,开辟大了,小不了。上述的开辟空间的⽅式有两个特点• 空间开辟⼤⼩是固定的。• 数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整。所以C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。二. malloc和free1.malloc函数原型:<stdlib.h>

2024-04-24 19:57:47 999

原创 联合体&枚举

2.可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。当我们改变联合体成员其中一个值的时候,另一个成员也会跟着改变,这2个成员不会共同用。联合体里面的成员共用同一块空间,当改变一个成员值的时候,另一个成员也要跟着改变。,使用其中一个成员就不能使用另一个成员,修改一个成员,所有成员都会都会改变。//因为#define定义的符号是没有类型的,枚举定义的成员是有枚举类型的。1.联合的成员是共⽤同⼀块内存空间的,这样⼀个联合变量的大小,

2024-04-21 16:14:02 772 1

原创 结构体详解 - 数据结构

浪费的空间别人也用不上。很多的属性只需要⼏个bit位就能描述,这里使⽤位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络的畅通是有帮助的。4.当⼀个结构包含两个位段,第⼆个位段成员比较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利⽤,这是不确定的。比如:一个整型变量a, 里面只存1,2,3,0,这4个数字其中1个,只占2个bit位,要是给1个整形的空间就浪费了。,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是先输⼊放在⼀个变量中,然后赋值给位段的成员。

2024-04-16 13:10:31 1016

原创 数据在内存中的存储

一. 整数在内在存中的存储数据在内存中是以二进制的形式存储的。在讲解操作符的时候,我们就讲过了下⾯的内容:整数的2进制表⽰⽅法有三种,即原码,反码和补码。有符号的整数:三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。整数在内存存储形式:正整数的原、反、补码都相同。负整数的三种表⽰⽅法各不相同。原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

2024-04-04 21:58:29 822 1

原创 c语言内存函数

因为拷贝3 4的时候被改成1 2,拷贝5 6的时候因为3 4被改成1 2所以5 6也是1 2 ,内容重叠拷贝结果就是错误。• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。memcpy使用在内存不重叠拷贝,如果拷贝内容是重叠/同一块内存空间,就不要使用这个函数。因为可能拷贝任何数据。• 如果source和destination有任何的重叠,复制的结果都是未定义的。总结:当你内存设置的值不满意的时候,就可以用memset来设置成你想要的值。

2024-03-26 20:15:01 635 1

原创 c语言字符串函数讲解和模拟实现

zhangsan@163.com - 他会从str指向的字符串找到分割符的标记,并把@改成以\0结尾,同时会返回起始位置z,但是我给你一个字符串,不能被你改掉,得拷贝一份进行操作。3.后面几次调用,第一个参数传NULL,从被保存好的位置查找,调用完返回的地址给s, 不为NULL就打印,为NULL跳出循环。perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。1.perror打印的错误信息是你想要的,你就可以用这个函数,不用借助printf打印,它直接就给你打印了。

2024-03-24 23:08:28 646 1

原创 指针(5)C语言指针笔试题

2. * -- * ++cpp + 3:先看运算符优先级,+号是最低的,++cpp:指向cp2的位置,解引用访问到cp数组c+1这块空间,--:c+1-1里面值-1 = c,4.cpp[-1]-->*(cpp-1),cpp-1指向cp1,解引用访问到cp数组c+2这块空间,再*(c+2-1),访问到c1这块空间N的地址+1,拿到E。3.cpp[-2] -->*(cpp-2),cpp-2指向了cp0,解引用访问到cp数组c+3这块空间,再解引用访问到c3这块空间,然后F地址+3,拿到S。

2024-03-17 15:59:38 610 1

原创 指针(4)回调函数和qsort函数的实现

2.如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。进入main函数,再选择进入case1,调用calc函数,里面参数是Add的地址,通过pf调用的时候,就是调用Add的函数。2.通过一个函数,再用另一个函数作为参数,实现比较的功能,再用指针变量接收地址,当调用这个函数指针,就调用实现功能的函数。1. 一个数组,里面有10个元素,传给冒泡函数2(元素起始位置,元素个数,元素大小,实现比较2个元素比较大小的函数)不是比较长度,而是比较内容。

2024-03-16 21:57:17 913 1

原创 指针(3)

4.当我们写数组指针的时候,因为[]的优先级要⾼于 * 号的,所以要先用()来保证 * 和变量的结合,不写()变量就会和[]结合成为指针数组!2.signal函数的参数有2个,第一个int,第二个void(*)(int)函数指针类型,该指针指向的函数是int,返回类型是void。3.arr和arr[0]是取出的数组首元素的地址,&arr是数组的地址,当我们写个数组指针的时候,一定是取出整个数组的地址。1.要先写个指针(*pa),再写指针主指向的是数组[],指向数组的几个元素[10],和元素类型。

2024-03-10 21:19:22 622 1

原创 指针(2)

当二级指针,指针变量的类型写错了,少写一颗星,可以存放一级指针的地址,但解引用和(+-)权限也会有变化,所以类型写错了,计算也会有问题。内部单独放一个数组名的时候,数组名表示整个数组,计算的是整个数组的大小,单位是字节。注意:取出数组的地址和取出数组首元素的地址,从值上来看是一样的,但有很大的区别。1.数组传参,形参部分写成数组,也不会创建数组,本质是指针,还是访问实参的数组。,这的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组的元素。每个元素是整形指针,所以是指针数组。

2024-02-29 21:37:07 765 1

原创 指针(1)

一.内存和地址我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。电脑上内存是8GB / 16GB / 32GB等,那这些内存空间如何⾼效的管理呢?-->高效查找内存这些数据?其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。计算机中常⻅的单位(补充):⼀个⽐特位可以存储⼀个2进制的位1或者0。

2024-02-15 13:14:44 729 1

原创 C语言操作符详解

一. 操作符的分类• 算术操作符: + 、 - 、 * 、 / 、 %双目操作符• 移位操作符: << >>移动的是二进制的位• 位操作符: & | ^ ~使用二进制位计算• 赋值操作符:= 、 += 、 -= 、 *= 、 /= 、 %= 、 <<= 、 >>= 、 &= 、 |= 、 ^=• 单⽬操作符:!、++、--、 & 、 * 、 + 、 - 、~、sizeof、(类型)• 关系操作符:> 、 >= 、 < 、 <= 、 == 、!

2024-02-02 17:59:16 974

原创 函数递归和斐波那契数详讲

(1).在C语言中每次函数调用,都需要为本次函数调用在栈区申请一块内存空间来保存函数调用的各种局部变量的值,这块空间被称为运行时堆栈,也叫函数栈帧。(3)所以采用函数递归方式完成代码,要是递归层次太深,就会浪费太多栈帧空间,也可能引起栈溢出stackoverflow的问题。迭代:这样实现Fact函数值调用了一次,创建的函数栈帧空间就小一些,不会频繁开辟大量空间,迭代实现效率比递归更高。2.如果使用递归写出的问题,是存在明显的缺陷,那就不能使用递归,得用迭代的方式处理。7.关于函数调用过程中如何开辟的空间;

2024-01-28 09:32:23 1239

原创 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元, 可以喝多少汽水(编程实现)。

规律:你的的汽水跟你给的钱多一定关系的;方法3 递归站在空瓶上思考。方法2:用自定义函数写。

2024-01-26 19:09:54 193 1

原创 扫雷游戏讲解

我们可以去我们game.头文件,用define定义常量,我们要用的库函数也可以写在game.h文件对应我们的.c文件只需要包含咋们创建的头文件,自己创建的头文件要用双引号包含比如:#include"game.h"8.字符转换数字:'0'-'0'=0,'1'-'0'=1,'4'-'0'=4,数字字符 - 字符0 等于本身数字。(2)排查雷:如果位置是雷,就炸死了,游戏结束.不是雷,就统计这个坐标周围的雷的个数,并显示。当我们去排雷,如果不是雷0,是雷1,但是还要统计周围几个雷,要是统计周围的雷1个了?

2024-01-26 15:41:35 536 1

原创 vs编译环境调试和重要性,栈区讲解

断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂定执⾏,就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。(1)栈区内存的使用习惯是从高地址向低地址使用的,所以先创建的地址大,后创建的地址小。所以变量i的地址较大的。先把你想观察的值输入好,输入好了为啥无法读取内存,因为你就调试,程序还没走,还要按F10或者F11才会慢慢有值,让程序一步一步走起来。(2)因为栈区使用地址的习惯,i的地址高,又因为随着下标的增长,地址是由低到高变化的,当使用到高地址就慢慢接近i的地址,

2024-01-25 17:30:19 1109 1

原创 函数基础总结:只能说多文件使用被搞哭啦

2.全局变量被static修饰后,外部链接属性,变成内部链接属性,就是这个全局变量,只能在自己所在的.c文件中使用,其它文件看不到,相当于作用域变小了。要使用必须调用,不一定要先定义,因为可以在.h头文件定义,然后再在其它源文件.c,实现你定义的功能,我们使用调用一下就ok了。1.函数需要返回类型,你没写默认函数返回int类型,接收它返回来的值,打印是5,明明打印的字符,为啥是5,因为随机的。3.库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头⽂件,不包含是可能会出现⼀些问题的。

2023-10-31 15:38:15 68 2

原创 数组基础总结

如果我们把一维数组作为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维以上的数组称为多维数组。3.有时候不光知道左下标,还要知道右下标,当我们用sizeof求右下标要n-2,因为下标是从0开始,还要减去\0这个字符。假如一个数组 int arr[ ] = {1,2,3,4,5,6,7,8,9,10};1*数据是有下标的,下标是从零开始的,假设数组有n个元素,最后个元素的下标是n-1,下标相。数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就算数组的类型。

2023-10-27 13:26:41 50 4

空空如也

空空如也

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

TA关注的人

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