- 博客(18)
- 收藏
- 关注
原创 顺序表专题
当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的⽅式。常⻅的数值1、2、3、4.....、教务系统⾥保存的⽤⼾信息(姓名、性别、年龄、学历等等)、⽹⻚⾥⾁眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据。求数组的⻓度,求数组的有效数据个数,向下标为数据有效个数的位置插⼊数据(注意:这⾥是否要判断数组是否满了,满了还能继续插⼊吗).....案例:蔬菜分为绿叶类、⽠类、菌菇类。
2024-08-10 22:07:31 327
原创 C语言预处理详解
(假定某个程序中声明了⼀个某个⻓度的数组,如果机器内存有限,我们需要⼀个很⼩的数组,但是另外⼀个机器内存⼤些,我们需要⼀个数组能够⼤些。结果是11,为什么呢,因为我们传入的是5+1,#define的优先级很高,所以直接进行了预处理,就是5+1*5+1,结果显而易见就是11,当我们使用宏的时候要注意优先级的问题,此时我们可以用()将a保护起来,此时就可以得到正确的结果了,结果是55,还是因为优先级问题,double将两个数相加,直接替换成了5+5,但是并不会进行计算,10*+5==55,结果由此而得。
2024-08-07 00:01:51 1052
原创 c语言编译和链接
我们在 test.c ⽂件中每⼀次使⽤ Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地址,但是由于每个⽂件是单独编译的,在编译器编译 test.c 的时候并不知道 Add 函数和 g_val变量的地址,所以暂时把调⽤ Add 的指令的⽬标地址和 g_val 的地址搁置。词法分析就是将源码逐个分析,例如int arr[] = {0},int是定义整数类型,arr是一个标识符,[是左括号]是右括号,=是等号,{是左花括号,0是一个整数,}是右花括号,机器就是逐个进行分析的,
2024-08-06 14:40:10 578
原创 C语言文件操作
如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使⽤⽂件。在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了指针和⽂件的关系。⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名。
2024-08-06 14:14:34 559
原创 c语言动态内存管理
C/C++程序内存分配的⼏个区域:1. 栈区(stack):在执⾏函数时,函数内局部变量的存储单元都可以在栈上创建,函数执⾏结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很⾼,但是分配的内存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。2. 堆区(heap):⼀般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。分配⽅式类似于链表。3. 数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。
2024-07-23 00:21:53 973
原创 联合和枚举
联合体和结构体类似,但是又结构体又不同,结构体中的每个成员都是独立的,修改其中任意一个值不会影响另外一个值,但是在联合体中,修改其中一个值,一定会有另一个值跟随他发生改变,联合体中所有值都共用同一块内存空间。第一个输出8,因为char型数组的对齐数是1,而大小是5,int型对齐数是4,大小是4,所以联合体大小应该是其中最大的成员大小5,但是5并不是最大对齐数的整数倍,因此内存大小变成了8.我们仔细分析就可以画出,un的内存布局图。在C语⾔中是可以的,但是在C++是不⾏的,C++的类型检查⽐较严格。
2024-07-19 01:30:50 863
原创 C语言结构体
1. 位段的成员必须是 int、unsigned int 或signed int ,在C99中位段成员的类型也可以选择其他类型。2. 位段的成员名后边有⼀个冒号和⼀个数字。int b :4;A就是⼀个位段类型。那位段A所占内存的⼤⼩是多少?
2024-07-19 00:03:22 887
原创 c语言内存函数
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。• 如果source和destination有任何的重叠,复制的结果都是未定义的。对于重叠的内存,交给memmove来处理。memcpy的模拟实现。
2024-07-07 00:51:57 240
原创 字符串函数和字符函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h。
2024-07-02 23:00:24 441
原创 手撕指针(四)
本质上是一个数组,每一个元素是函数指针parr先和[]结合,先成为一个数组,然后每个元素是函数指针,是int (*函数名)()类型的函数指针。
2024-03-27 23:14:26 324
原创 手撕指针(三)
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?二级指针就是再次将指针的地址存放到指针里面。对于⼆级指针的运算有:*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa .**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a .
2024-03-10 20:14:16 956 2
原创 手撕指针(二)
一般情况下数名是数组首元素的地址特殊情况但在sizeof()中,数组名是数组整个整个数组的⼤⼩&取地址操作符是取出的数组的整个地址当计算一个数字的长度时,&取出的是整个数组的整个的大小,是40个字节,而arr【0】只是一个数组元素的地址大小,由此可以计算出整个数组有10个元素。此时不难发现,arr[0]和arr的地址一样,区别就在于二者进行计算时一个加减只变化了4个字节,而arr一次变化了40个字节,arr+1一次跳过的是他本身的字节大小而&arr+1一次跳过的是整个数组的大小的字节。
2024-03-01 13:41:18 408 1
原创 手撕指针(一)
先用一个简单的实例引入内存的概念,例如在生活当中宿舍楼宿舍楼里的每一个房间都是有房间号的,例如101,501,519等等,每个房间都是有对应的数字号,并且这些数字号不会重复,有了房间号,你的朋友就能快速找到你,可以提高效率。我们知道计算上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何⾼效的管理呢?其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。
2024-02-06 21:18:06 939 10
原创 操作符详解
代码1:变量的定义int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化。struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化//代码3int data;//结构体嵌套初始化struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化。
2024-01-25 16:01:05 853
原创 函数和数组实现扫雷游戏
在继续分析,当我们点击一个位置之后,这个位置附近的8个方块的1和0的个数应该被存储起来并且打印出,被我们看到,这样才能进行下一步的游戏,但是,如果单单一个数组,雷,雷的个数,存储类型太多,容易产生歧义,因此,可以创建两个数组,为了保持神秘感,在扫雷之前,各个位置应该存放‘*’并打印出来,为了保持两个数组的一致,可以使用两套相同类型的数组,雷和非雷可以用'1'和'0'表示。(1)扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。因此,这一步骤的设计到二维数组。
2024-01-15 12:08:13 556
原创 函数的递归
要想完成1234的分离,首先把4分离出来,其次在分离3,一直分离到1,传递参数进入子函数,1234>9,在进入123,,123也大于9,进入12,还是大于9,在进入1,1
2024-01-12 17:21:59 471 1
原创 输入输出中一些小秘密第一章
在输出中,n表示输出的数子宽度至少为n,如果输出的数小于n则自动在前面补0,大于n则直接输出实际数,类似于输出的%d。当大于四位数时则只读取前面的四位数。当小于等于4位数时则读取实际数。最后预祝每一个努力的人都能成功。此时是实际数宽度小于n。
2023-12-30 01:13:35 417
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人