
01 深入理解 c
文章平均质量分 87
讲解c和c++需要掌握的知识点,打好基础
且听吟风°
扣:903199567
展开
-
【01 c语言常见概念】
点击创建项目选择创建项目格式,先创建空项目修改项目名和位置后创建源文件处右键添加新建项.c结尾的是源文件,.h结尾的是头文件c语言有一批保留的符号,如int等,被称为关键字关键字有特殊的意义,保留给c语言使用自己的创建的不能与关键字重复关键字不能自己创建。原创 2023-10-10 16:45:31 · 117 阅读 · 0 评论 -
【02 数据类型和变量】
类型就是数据拥有的共同特征,只有知道了类型,才知道怎么操作数据。原创 2023-10-18 14:46:18 · 107 阅读 · 1 评论 -
【03 分支和循环】
首先1,初始化循环变量,接下来是表达式2的判断部分,结果为0,则循环结束。switch语句的分支只有遇到break才能跳出switch语句,如果case后没有break,代码会继续向下执行,知道遇到break或语句结尾。上代码输出结果空,下面的else虽然和第一个if格式相对,但仍匹配的是最近的if,当a==1不满足时,不会执行下面的if,也不会走对应的else。c语言逻辑运算符的特点,先对左侧的表达式求值,如果左边的都不满足,就不会对右边的再计算,这种情况称为短路。0为假,非0表示真。原创 2023-10-26 14:13:55 · 82 阅读 · 1 评论 -
【04 数组的使用】
用strlen记录右边最后一个的下标,再记录左边第一个下标,左边下标不大于右边的时候循环,让符号的两边内容等于字符串的内容,两个下标不断往中间移动。sizeof也可以计算类型的大小,数组的每个元素类型都是相同的,只需要计算一个大小,sizeof(ary[0]),这里计算第一项的大小,为4字节。遍历数组的时候如果不知道数组的大小,可以用sizeof计算,sizeof是一个关键字,可以计算变量、类型、数组的大小。由此可以计算数组的元素个数,用数组总的大小除以每一个元素的大小,就可以算出数组有多少个元素。原创 2023-11-01 18:08:01 · 209 阅读 · 0 评论 -
【 05 函数 】
自定义函数更加重要函数的定义,如果函数在调用时后面定义就会报错,这时需要在调用前声明函数,函数声明需要写出函数的返回值类型、函数名、参数,然后加个分号就行了//函数声明int main()int n = 4;ptt(ary);return 0;return 5;一般将函数定义在调用前,可以不用声明。原创 2023-11-02 22:14:15 · 141 阅读 · 0 评论 -
【06 函数递归】
递归就是函数自己调用自己下面是一个最简单的递归int main()main();//main函数中⼜调⽤了main函数return 0;上面的递归只是为了演示递归的形式,不是为了解决问题。会陷入死递归,导致栈溢出(Stack overflow)把原问题转化为一个与原问题相似、规模较小的子问题求解,直到子问题不能被拆分,递归就结束。是一个大事化小的过程。递就是递推的意思,归就是回归。原创 2023-11-09 01:10:18 · 198 阅读 · 1 评论 -
【07 vs调试技巧】
bug本意昆虫或虫子,现在一般指电脑系统或程序中,隐藏着一些未被发现的问题和缺陷,简称程序漏洞bug创始人格蕾丝·赫伯,继电器停止了工作,发现触点间有一只飞蛾,所以用“bug”来表示程序中的错误 发现程序中存在问题,下一步就是找到并修复问题,这个过程叫调试,debug,消灭bug的意思。原创 2023-11-08 00:57:15 · 140 阅读 · 1 评论 -
【08 数组和函数实战: 扫雷游戏】
开始选择点击位置,如果不是雷,显示周围雷的数量,如果是雷,则被炸死,游戏结束。3. 我们可以用两个数组,一个存放是地雷和非雷的信息,另一个用来给用户显示周围地雷的信息。布置雷的地图数据和排查出显示的数据都需要存储,首先想到用一个9*9的二维数组存放。图里(2,5)坐标本身存的值为0,遍历周围位置共有1个雷,所以该位置显示给用户1表示周围有1个雷。//⽤来存放排查出的雷的个数信息。如果排查位置是(2,5)这个坐标,访问周围8个位置,统计周围雷的个数显示在当前位置。//⽤来存放布置好的雷的信息。原创 2023-11-05 12:55:31 · 181 阅读 · 1 评论 -
【09 操作符讲解】
使用补码,可以将符号位和数据位统一处理,加法和减法也统一处理(CPU)只有加法器,减法实际转换为加法,如果用原码计算,会发现结果是错误的。8进制最大的数7写成二进是111,8进制只需要三个二进制就可表示,所以换算的时候直接从右往左每3个二进制换算一个8进制,剩余不够三个的直接换算。思路: &的计算是该位两个都是1则补1,1原创 2023-11-10 20:16:56 · 159 阅读 · 1 评论 -
【10 函数栈帧的创建和销毁】
函数栈帧(stack frame): 就是函数调用过程中的调用栈(call stack)所开辟的空间,这些空间是用来存放临时参数和函数返回值临时变量(包括函数非静态的局部变量以及编译器自动产生的其他临时变量)保存上下文信息(函数调用前后需要保存不变的寄存器)栈(stack)是现在计算机最重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,也没有局部变量。原创 2023-11-10 00:07:42 · 242 阅读 · 1 评论 -
【11 详解函数栈帧】
edecl调用约定从右往左传递参数,参数空间由调用方清理函数返回值一般由eax寄存器带回debug模式局部变量空间会初始化为cccccccc,申请的空间大于需要使用的变量空间释放并不会使数据发生变化,只会将空间标位未使用,然后挪栈的位置。所以内存仍有残留数据。原创 2023-11-27 17:45:30 · 1198 阅读 · 0 评论 -
【12 深入理解指针 (1)】
指针的类型决定了指针向前或向后走一步有多大。原创 2023-11-13 01:06:40 · 300 阅读 · 0 评论 -
【13 深入理解指针 (2)】
这种代码怎么进行优化,比如数据为 9,1,2,3,4,5这种,第一趟排序完数组已经变成有序了,那么就没有必要继续冒泡下去了。这里 &arr[0] 的方式拿到了第一个元素的地址,但是数组名本来就是地址,而且是数组首元素的地址。在函数内部没有正确获取元素个数,这时就体现了数组传参的本质,数组传参本质上传递的是数组首元素的地址。前两个+1加的是一个元素的大小4,因为这两个都是取首元素的地址,+1就是跳过一个元素。(arr+i),在编译的时候,也是转换为首元素的地址+偏移量求出元素的地址来访问的。原创 2023-11-14 11:59:18 · 431 阅读 · 1 评论 -
【14 深入理解指针 (3)】
二维数组传参,形参可以写成数组,也可以写成指针形式。原创 2023-11-16 19:49:09 · 192 阅读 · 1 评论 -
【15 深入理解指针 (4)】
strcmp的返回值,小于0,第一个字符串小于第二个,等于0,两个字符相等,大于0,第一个字符串大于第二个。如果把函数的指针作为参数,这个指针调用的所指向的函数,就是回调函数。上面结果是按年龄大小升序排列,其中按名字比较运用了strcmp这个库函数,这个函数是专门用来比较两个字符串的大小,因为字符串是不能用关系符来比较的。函数的返回值说明,小于0第一个指针数据小于第二个,等于0相等,大于0第一个数据大于第二个。size是每个元素的大小,如int是4字节,决定了每次越过一个数据的大小。原创 2023-11-19 20:30:22 · 394 阅读 · 1 评论 -
【16 深入理解指针 (5)】
字符串数组中\0也会占一个空间,所以申请时需要包含\0的大小,char str[3]=“abc”,这样不包含\0,字符串找不到\0会打印错误。操作符sizeof是变量所占内存空间大小的,单位是字节,如果操作数是类型,计算的是类型创建的变量所占内存空间的大小。(8) 4/8,取出数组地址+1,跳过整个数组大小,指向数组后第一个地址。(5) 随机值,从数组地址开始,遇到\0停止,(同1)(2) 随机值,数组地址开始,遇到\0停止,同(1)(4) 4/8,和(2)相同,是数组第二个元素地址。原创 2023-11-21 14:08:12 · 446 阅读 · 1 评论 -
【17 指针大纲总结】
深入理解指针 1深入理解指针 2深入理解指针 3指针练习 1深入理解指针 4深入理解指针 5原创 2023-11-25 17:26:27 · 561 阅读 · 0 评论 -
【18 数组和函数实战: 斗地主游戏】
当第一个玩家,也就是i=0的时候,循环17次,一人17张手牌,所以赋值的卡牌下标就是0-16,当第二个玩家是,下标从17-33,当i=1时,卡牌数组num中括号里的值需要是17,所以用i 乘玩家卡牌常量PLAYCARDS,再减去多余的3张地主牌,就是 1*(20-3)+0,然后把底牌手牌也输出。考虑到需要比较卡牌的大小,从1开始赋值,1为最小的牌,通过下面的转换函数,将1转换为最小牌3的ascii码输出,花色每4个一轮,红心从3开始赋值,大小王单独赋值为14和15。PLAYER: 玩家数量,默认为3。原创 2023-12-02 17:23:37 · 1316 阅读 · 0 评论 -
【19 字符函数和字符串函数】
kmp算法是字符匹配算法,核心是利用匹配失败后的信息,尽量减少子串的匹配次数达到快速匹配的目的。具体通过next()的函数实现,本身包含了模式串的局部匹配信息,时间复杂度为O(m+n)KMP的i值不会回退,只回退j,j也不是一定回退到0位置。原创 2023-11-30 20:35:11 · 1453 阅读 · 0 评论 -
【20 自定义类型: 结构体】
位段的声明和结构是类似的,有两个不同位段的成员必须是 int、 unsigned int 、signed int,在C99中位段成员的类型也可以是其他类型位段的成员名后边有一个冒号和一个数字,表示占几位struct Aint _a : 2;int _b : 5;这就是一个位段那么sizeof(struct A)位段的大小是多少?答案是8,总共47位,由于1个整形32位,所以需要2个整形就是8字节。原创 2023-12-18 13:51:28 · 1002 阅读 · 0 评论 -
【21 自定义类型: 联合和枚举】
比如,高一个活动,上线一个礼品单,有三种商品: 图书、杯子、衬衫,每一种都有:库存量、加个。联合体的成员共用一块内存,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)第一个类型最大的是char,5个字节,整体对齐到最大对齐数4的整数倍,也就是8。这些可能取值有值,默认从0开始,依次递增1,声明枚举类型的时候也可以赋初值。像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。当最大成员大小不是最大对齐数整数倍的时候,就要对齐到最大对齐的整数倍。原创 2023-12-19 11:10:30 · 938 阅读 · 0 评论 -
【22 数据在内存中的存储】
超过一个字节的数据在内存中存储的时候,就有存储顺序的问题了,按不同的顺序,分为大小端存储大端存储模式: 数据的低位字节存在高地址处,高位字节存在低地址处小端存储模式: 数据的低位字节存在低地址处,高位字节存在高地址处。原创 2023-12-17 00:28:56 · 1057 阅读 · 0 评论 -
【23 内存函数】
上面是想从arr1+3,也就是从4开始的位置,复制5个数据,也就是1,2,3,1,2,3,4,5,9,10。但最后的结果却不是这样的,原因就是当到重叠的位置时,数据已经被之前复制的覆盖过了,源数据已经被改变,所以出现错误。第二种,目标地址desc在src+num中间,这种情况从前向后拷贝时原值会被替换,所以要从后往前拷贝。上面的两个字符串,其中g小写和大写,由于小写的值更大,所以会返回大于0的数。memeset是用来设置内存的,将内存中的值以字节为单位设置为想要的内。这时换成memove函数试试。原创 2023-12-13 23:06:27 · 1357 阅读 · 0 评论 -
【24 动态内存管理】
程序运行崩溃,因为p是形参,是对str的一份拷贝,申请空间是对p赋值。当是情况2的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用,这样返回的是一个新的内存地址。有时候发现申请的空间太小了,有时候又太大了,为了合理分配,需要对大小做灵活的调整。但是一对于空间的需求,有时候空间大小在运行的时候才能知道,这样的开辟方式就不能满足了。当是情况1的时候,要扩展内存就直接在原有内存之后直接追加空间,原来空间的数据不会变化。//在栈上开辟10个字节的连续空间。原创 2024-01-01 22:35:31 · 988 阅读 · 0 评论 -
【25 编译和链接】
等待最后链接的时候由连接器根据引用的符号Add在其他模块中查找Add函数的地址,然后将test.c引用的Add指令重新修正,让目标地址为真正的函数地址,对于全局变量也是如此,这个地址修正过程叫:重定位。上面的讲解编译和链接的过程是比较简洁的,到最后生成可执行程序的过程,其实很多内部细节没有展开,比如:目标文件的格式elf,链接底层实现中空间与地址分配,符号解析和重定位等,如果你有兴趣,可以看《程序的自我修养》——书来详细了解。链接是一个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。原创 2024-01-09 20:04:20 · 958 阅读 · 0 评论 -
【26 预处理详解】
c语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的FILE//进行编译的源文件LINE//文件当前的行号DATE//文件被编译的日期TIME//文件被编译的时间STDC//如果编译器遵循ANSI C,其值为1,否则未定义举个例子:FILELINE基本语法:举个例子#define reg register //为了register这个关键字,创建一个简短的名字😉 //用更形象的符号来替换一种实现。原创 2024-01-10 17:19:50 · 1057 阅读 · 0 评论 -
【27 文件操作】
磁盘上的文件是文件但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)原创 2024-01-07 17:37:23 · 849 阅读 · 0 评论 -
【28 联系人管理】
一个可以存储100个人联系人信息的程序,提供添加联系人,删除联系人,查找联系人,修改联系人,显示联系人,排序联系人的功能。原创 2024-01-11 16:38:10 · 364 阅读 · 0 评论 -
【C语言阶段总结】
原创 2024-01-13 23:43:07 · 588 阅读 · 0 评论