
C语言复习
文章平均质量分 62
圣马丁鸟
这个作者很懒,什么都没留下…
展开
-
C一些其它知识点
前缀L在单引号前面,表示宽字符,宽字符的打印使用 wprintf, 即wprintf()的占位符为%lc;宽字符的字面量必须加上前缀L,否C语言会把字面量当作窄字符类型处理.在双引号前面,表示宽字符串,即wprintf()的占位符为%ls.普通字符占一个字节,宽字符占用两个字节(汉字也属于宽字符)3.宽字符的类型是wchar_t。1.●▼▲这些叫宽字符。原创 2024-03-10 20:16:53 · 376 阅读 · 0 评论 -
一些造贪吃蛇所需要的冷门知识
1.控制台:平时的那个黑框框,还有cmd即命令提示符2.使用cmd命令设置控制台窗口的大小:30行,100列3.通过命令设置控制台窗口的名字title 贪吃蛇4.我们能够用C语言中的system函数来执行系统命令2.3.4例:system("title 贪吃蛇);注:在程序结束后,名字会恢复原样可以用这个:system("pause");//pause叫暂停(按任意键继续)5.坐标(0,0)表示最左上角哪个地方(注:是左上角顶部!原创 2024-03-10 15:45:38 · 908 阅读 · 0 评论 -
数据结构2
空间复杂度不是程序占用了多少bytes的空间,因为这个也没意义,空间复杂度算的是变量的个数.空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。数组所占用的空间复杂度也是表述的是变量的个数(可能是常数个,也可能是N个)注:空间复杂度算的是额外的空间消耗(即因为算法的需要而开辟额外的空间)4.斐波那契递归Fib的时间复杂度是O(2 ^ N)6.冒泡排序的空间复杂度是O(1)(2).插入和删除才是最麻烦的点。时间复杂度是O(N ^ 2)所以时间复杂度是O(N)原创 2024-02-22 20:16:11 · 525 阅读 · 0 评论 -
数据结构1
6.算法的时间复杂度是一个函数(数学里的函数),算法中的基本操作的执行次数,为算法的时间复杂度。5.时间复杂度主要衡量一个算法的运行快慢,空间复杂度主要衡量一个算法运行所需要的额外空间。当N趋于无穷时,F(N)后边那两项几乎可以忽略不计,所以它的档次是O(N ^ 2)上述代码的时间复杂度是F(N) = N ^ 2 + 2 * N + 10。1.内存用数据结构管理数据,外存(硬盘)用数据库(也称文件)管理数据。16.我们要考虑好代码的实现难度,简洁程度,(可读性,可维护性)(函数式中只有常数)原创 2024-02-22 17:19:26 · 569 阅读 · 0 评论 -
C语言链表至双向链表(已修)
1.在做OJ题的时候,要把题目给的信息看完整。3.写函数时,有时要保持接口的一致性。4.顺序表和双向链表的优缺点分析搜。2.双向链表一定是带有哨兵位的。原创 2024-02-14 19:58:54 · 393 阅读 · 0 评论 -
顺序表的运用至单链表02(已修)
1.顺序表是线性表的一种.线性表的物理结构不一定是线性的线性表的逻辑结构一定是线性的但顺序表的物理结构和逻辑结构都一定是线性的2.头文件的嵌套调用会有语法错误1.链表能解决顺序表(1).扩容导致空间浪费(2).插入数据在头部或在中部时,要整体进行挪动(3).重新扩容导致的时间浪费的问题2.链表也是线性表的一种它的逻辑结构连续而物理结构不连续3.链表是由一个一个节点组成的4.函数传输指针也可能是传值调用1.exit(1)的神奇运用结果是什么都不打印。原创 2024-02-08 19:14:51 · 393 阅读 · 0 评论 -
C语言顺序表(已修)
1.可以用ctrl + c 来终止程序运行2.可以将0转换为一个结构体类型的指针,而这就相当于某个结构体的首地址是0。此时,每一个成员的偏移量就成了相对0的偏移量.3.偏移量计算的位置从起始该变量的起始位置开始4.一个文件:test.txt即文件名.拓展名而且,文件名可以不包含后缀名5.键盘输入是从标准输入流输入的6.sscanf函数读到空格就不读了7.将整数0强制类型转化为某个结构体类型的指针,则在地址0处开始会造一个这样的结构体。原创 2024-02-05 19:22:14 · 373 阅读 · 0 评论 -
编译和链接(已修)
1.我们输入的代码在变为命令时,要经过翻译环境(将代码变为可执行的机器指令)和运行环境(执行对应指令)即将.c文件转化为.exe文件2. 翻译环境具体搜:3.编译具体三个步骤(预编译(也称预处理),编译,汇编)搜:4.在C语言中,#开头的指令都是预处理指令,在预处理阶段完成,5.预处理过程中,进行了(1).头文件的包含还有#define的替换(就是运行了#开头的指令)(2).注释的删除(替换成了空格)6.在预处理过程中,源文件和头文件都会被处理成.i为后缀的文件7.预处理阶段主要处理#开头的指令,处理规则如原创 2024-02-04 09:36:56 · 825 阅读 · 0 评论 -
C的文件操作(已修)
1.栈区上的空间运行效率很高堆区分配的空间一般由程序员主动释放静态区的话程序运行结束后由系统释放2.根据数据的组织形式,数据文件被称为文本文件或者二进制文件数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。而字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。原创 2024-02-02 10:10:24 · 460 阅读 · 0 评论 -
动态内存分配(已修)
情况二:在已经开辟好的空间后边,没有足够的空间,直接进行空间的扩大在这种情况下,realloc函数会在内存的堆区重新找一个空间 (满足新的空间的大小需求的同时会把旧的数据拷贝到新的新空间,然后释放旧的空间,同时返回新的空间的起始地址。包含柔性数组成员的结构要用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。对一部分动态分配的内存进行free函数的空间释放(即同一块空间的不完全释放)后边那个指针指向的是要释放的空间的起始地址。原创 2024-01-30 22:33:28 · 389 阅读 · 0 评论 -
C语言数据在内存中的存储和结构体&联合体&枚举(已修)
17.位段的各个成员并非都有地址,所以不能对其使用&操作符,如果要赋值的话,就得要先造一个临时变量,然后再通过其赋值给位段的各个成员。10.是一个一个的来对齐的,对齐的目标点是当前的成员的占用空间(与编译器默认某个值(VS默认是8)的较小值)的倍数。8.关于结构体的自引用:可以在结构体内部创建并存储该结构体类型变量的指针(即地址),但不能再在内部创建该结构体。13.如果在结构体内部有结构体,那么里边那个结构体所占据的空间的那个起始的点要从该结构体整体的对齐数开始。联合体的大小至少是最大成员的大小.原创 2024-01-28 20:45:03 · 502 阅读 · 0 评论 -
C语言字符串函数和内存函数
在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示的意思是没有错误,而当我们在使用标准库中的函数的时候发生了某种错误,对应的错误码就会被存放在errno中,而一个错误码的数字是整数,我们很难理解是它是什么意思,所以每一个错误码都是有对应的错误信息的.strtok函数找到str1中的下一个标记,并将其用\0结尾,并返回一个指向这个标记的指针.原创 2023-12-23 12:00:49 · 2088 阅读 · 0 评论 -
C语言字符串函数
在前边那个字符串当中找后边那个字符串的位置,如果有,则返回后边那个字符串在前边那个字符串中 第一次 出现的地址,没找到则返回NULL。count超出那个要追加的字符串长度时,追加完成后加上\0,函数就跑路了,不会给你加上更多的\0。之间只要有d就是打印有符号数,?该函数会一直找arr1的\0再将前边的内容存入arr2中。目标字符串中也得有/0,否则没办法知道追加从哪里开始.他会给你默认在后边追加上一个\0(会多追加一个\0)目标空间必须有足够的大,能容纳下源字符串的内容.文档里的nul和NUL就是\0。原创 2023-12-21 23:13:16 · 2176 阅读 · 0 评论 -
C语言指针7
这里的a是第一行的地址,*a就是第一行,sizeof(*a)计算的是第一行的大小,16个字节。这里不存在越界,因为sizeof内的表达式不会真实计算的,计算的是第四行的大小即16个字节。1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。第二行的数组名,单独放在sizeof内部,计算的是第二行的大小即16个字节。2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址.访问的是第二行,计算的是第二行的大小,16个字节。7.%d打印的是原码,%p打印的是补码。原创 2023-12-20 22:34:08 · 533 阅读 · 0 评论 -
C语言指针第六集
在监视那里输入数组名,元素个数即可.但要注意进入的这个函数必须要存在该数组,即该数组必须在此函数内部有一席之地。2.sizeof的操作数如果是类型的话,计算的是使用类型创建的变量所占内存空间的大小.5.对printf("%d\n", sizeof(*&arr));sizeof只关注占用内存空间的大小,不在乎内存中存放什么数据.那个my_exc函数参数可以将void*改为char*1.模拟实现qsort函数排序整形。arr的类型是int [5];原创 2023-12-18 21:56:30 · 685 阅读 · 0 评论 -
C语言指针5
第四个参数是函数指针, 这个函数是用来比较待排序的东西的两个元素的,比较elem1和elem2指向的元素,如果elem1 < elem2,则要求返回一个小于0的数字;如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,被调用的函数就是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应.双引号引起来的是字符数组,类型是char[ ],后面还隐藏一个\0,单引号的是一个字符,类型是char。原创 2023-12-18 19:33:52 · 513 阅读 · 0 评论 -
C语言指针4
13.二维数组解引用一次的的话是找到了一维数组,而此时一维数组是该一维数组的数组名,即该数组首元素的地址,再对它进行解引用就拿到了某个数据。这是一个函数的声明,函数名是signal,参数类型是(int, void(*)(int) ),返回类型是void (*)(int)12.二维数组传参传过去的也是首元素的地址,那么就可以用数组指针来接受那个一维数组,这也就是二维数组传参的本质。16.若parr是数组指针,则parr里面存的是这个数组的地址,解引用拿到的是首元素的地址。上述代码中p的类型是int*原创 2023-12-17 12:24:23 · 598 阅读 · 0 评论 -
C语言指针3
而在函数接收数组的形参那里,用的是指针来接收而并非用数组来接收。7.将一个数组传给函数后,不能在函数内部求数组的元素个数。因为给函数传数组时,传递的并非数组,而是数组首元素的地址。相邻的两个元素进行比较,如果不满足顺序就进行交换。4.size_t等价于unsigned int。而arr[i] == *(arr + i).8.数组降级指的是数组变为了数组首元素的地址。因此,arr[i] == p[i];上述代码中, p == arr;5.关于数组首元素的地址。sizeof,&数组名。上述代码中,数组降级了。原创 2023-12-16 23:22:28 · 480 阅读 · 0 评论 -
C语言指针2
17.NULL是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错.(用调试就能看出来)这样会越界访问,注:此处,指针可以指向数组之外的地址.但是不能通过其来访问。double* 类型的指针进行解引用后一次能访问8个字节。3.int* 类型的指针进行解引用后一次能访问4个字节。在*左边就是一样的,都不能通过p对p指向的内容进行修改。char* 类型的指针进行解引用后一次能访问1个字节。指针减指针运算的前提条件是:两个指针指向同一块空间。9.指针减指针可以得到负数。原创 2023-12-16 17:23:08 · 712 阅读 · 0 评论 -
操作符详解2
26.32位机器有32根地址总线,每根地址线出来的电信号转换成数字信号后是1或者0,那我们把32根地址线产生的2进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能存储.如果指针变量是用来存放地址的,那么指针变的大小就得是4个字节的空间才可以.同理,在64位机器上,有64根地址线,一个地址就是64个二进制位组成的二进制序列,存储起来就需要8个字节的空间,那么指针变量的大小就是8个字节。25.计算机不会事先找好内存来存储所有的地址,那些地址是咱约定俗成的,自己就知道的。原创 2023-12-15 17:17:33 · 1100 阅读 · 0 评论 -
2.操作符详解
从2进制序列中右边最低位开始向左每3个2进制位换算为一个8进制位,剩余不够3个2进制位的直接换算。从2进制序列中右边最低位开始向左每4个2进制位换算成一个8进制位,剩余不够4个2进制位的直接换算。7.原码取反(符号位不变)加 1,得到补码,补码取反(符号位不变)加一,得到原码。15.位操作符:&(按位与), |(按位或), ^(按位异或), ~(按位取反)4.有符号 的整形的二进制位最高位是符号位,其余是数值位。得到的b是a的补码(符号位也是)按位取反得到的值。有 0则 0,全 1才 1(符号位也遵从),原创 2023-12-13 22:29:14 · 1954 阅读 · 0 评论 -
1.函数递归起(复习)
12.递归的思想:把一个大型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了.所以递归的思考方式就是把大事化小的过程。2.在realse版本中,代码已经得到了优化(编译器可能会自作主张地对代码进行优化),在大小和速度上都是最优的。2.如果使用递归写出的问题,是存在明显的缺陷,那就不能使用递归,得用迭代的方式处理。1.如果使用递归写代码,非常容易,写出的代码没问题,那就使用递归;5.设立断点条件时,条件可以是表达式,但是不能是什么函数之类的。原创 2023-12-12 23:25:32 · 415 阅读 · 0 评论