C语言笔记
文章平均质量分 93
HackerKevn
这个作者很懒,什么都没留下…
展开
-
二十二、通讯录实现
通讯录基本功能//通讯录结构设计//通讯录具体功能及代码实现//初始化通讯录函数//增加联系人函数//显示所有联系人信息函数//查找指定联系人函数//删除联系人函数//修改指定联系人函数//通讯录的结构优化//初始化通讯录函数的优化//增加联系人函数的优化//释放通讯录空间函数原创 2023-10-16 21:54:29 · 472 阅读 · 41 评论 -
二十一、动态内存管理
动态内存开辟//动态内存函数//malloc//free//calloc//realloc//内存泄漏的概念//内存泄漏的分类//常见的动态内存错误//对NULL指针进行解引用//对动态开辟的空间越界访问//对非动态开辟的空间使用free释放//使用free释放动态开辟空间的一部分//对同一块动态内存多次释放//动态开辟内存忘记释放(内存泄漏)//C/C++程序的内存开辟//柔性数组原创 2023-10-13 13:08:10 · 326 阅读 · 39 评论 -
二十、自定义类型:枚举和联合
枚举类型的声明//枚举类型的优点//枚举类型的使用//联合体类型的声明//联合体类型的特点//联合体大小的计算//联合体类型的应用原创 2023-10-11 16:28:14 · 180 阅读 · 28 评论 -
十九、自定义类型:结构体
结构的声明//特殊的声明//结构体变量的创建和初始化//结构体内存对齐//对齐规则//offsetof宏//内存对齐的原因//修改默认对齐数//结构体传参//位段的定义//位段的内存分配//位段无法跨平台的原因//位段的应用//使用位段的注意事项原创 2023-10-09 20:37:27 · 172 阅读 · 31 评论 -
十八、数据在内存中的存储
整数在内存中的存储//大小端字节序和字节序判断//大小端的成因//浮点数在内存中的存储//浮点数的存储过程//浮点数的读取过程原创 2023-10-07 12:25:26 · 137 阅读 · 31 评论 -
十七、C语言内存函数
memcpy函数的使用和模拟实现//memmove函数的使用和模拟实现//memset函数的使用//memcmp函数的使用原创 2023-10-04 23:16:05 · 755 阅读 · 22 评论 -
十六、字符函数和字符串函数
字符分类函数//字符转换函数//strlen的使用和模拟实现//strcpy的使用和模拟实现//strcat的使用和模拟实现//strcmp的使用和模拟实现//strncpy的使用//strncat函数的使用//strncmp函数的使用//strtok函数的使用//strstr函数的使用和模拟实现//strerror函数的使用原创 2023-09-29 09:23:22 · 141 阅读 · 24 评论 -
十五、数组和指针笔试题解析
就是跳过一行也就是第二行的地址,对第二行的地址进行解引用实际上就相当于拿到了第二行的数组名,也就是说。由于两边的类型是一样的,所以这里进行强制类型转换是没有意义的,只是起到干扰的作用,是第一行的数组名,而数组名又是首元素的地址,所以就相当于把第一个元素也就是。表示的就是第二个元素的地址,对地址进行解引用,所以第一个输出的值为2.的形式打印,输出的结果就是从第四个字母开始的字符串,也就是。的形式打印,输出的结果就是从第四个字母开始的字符串,也就是。类型的指针数组中时,存放的实际上是首字符的地址,所以数组。原创 2023-09-27 16:29:04 · 126 阅读 · 20 评论 -
十四、指针(三)
上述代码中,其实是一次函数声明,声明的 signal 函数有2个参数,第一个参数是 int 类型,第二个参数是函数指针类型,该函数指针指向的函数参数是 int 类型,返回类型是 void,signal 的返回类型也是一个函数指针,该函数指针指向的函数参数是 int,返回类型是void。不过转移表也有自己的局限性,由于转移表的实现依赖于函数指针数组,而放在这个数组的元素的类型必须是相同的,也就是说放在函数指针数组中的函数的参数和返回类型必须是一样的。那么二维数组的首元素就是第一行,是一个一维数组。原创 2023-09-25 18:31:54 · 98 阅读 · 14 评论 -
十三、指针(二)
从调试结果可以发现, a 和 b 创建在 main 函数的内部,a 的地址是 0x005efbfc ,b 的地址是 0x005efbf0 ,在调用 Swap1 函数时,函数在内部创建了形参 x 和 y 接收 a 和 b 的值,但是 x 的地址是 0x005efb18 ,y 的地址是 0x005efb1c。上述代码虽然能够正常运行,但是test函数返回的是局部变量n的地址,当test执行完毕的时候变量n的空间就被释放了,此时如果把n的地址传给p,后续再通过p赋值的时候就会造成非法访问。原创 2023-09-22 08:45:50 · 86 阅读 · 6 评论 -
十二、指针(一)
指针变量也是一种变量,这种变量专门用来存放地址,存放在指针变量中的值也都会被理解为地址原创 2023-09-17 12:06:27 · 111 阅读 · 10 评论 -
十一、操作符详解
16进制的每一位数字都是0~9、A~F,各自写成2进制,最多有4个2进制位就足够了,所以2进制转16进制时,从2进制序列中右边低位开始向左每4个2进制位就换算成一个16进制位,剩余不够4个2进制位的直接换算。8进制的每一位数字都是0~7,而数字0~7各自写成2进制最多有3个2进制位就足够了,所以2进制转8进制时,从2进制序列中右边低位开始向左每3个2进制位就换算成一个8进制位,剩余不够3个2进制位的直接换算。逗号表达式中的表达式从左向右依次执行,整个表达式的结果是最后一个表达式的结果。原创 2023-08-13 22:18:23 · 71 阅读 · 9 评论 -
十、函数栈帧的创建和销毁
之所以上面的程序会输出“烫”这么一个奇怪的字,正是因为 main 函数调用时,在栈区开辟的空间的其中每一个字节都被初始化成0xCC,而 arr 数组是一个未初始化的数组,恰好就是在这块空间上创建的,0xCCCC(两个连续排列的0xCC)的汉字编码就是“烫”,所以0xCCCC被当作文本就是“烫”。在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数组压入栈中(入栈,push),也可以将已经压入栈的数据弹出(出栈,pop)。代码执行到 Add 函数的时候,就要开始创建 Add 函数的栈帧空间了。原创 2023-08-13 22:09:27 · 73 阅读 · 10 评论 -
八、VS实用调试技巧
当发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。 这个找问题的过程叫称为调试,英文叫debug(消灭bug)。 调试⼀个程序,⾸先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码, 重新测试。原创 2023-08-13 21:59:02 · 79 阅读 · 9 评论 -
九、函数递归
如果函数不返回,函数对应的栈帧空间就一直被占用,所以如果函数调用中如果存在递归调用,每一次递归函数调用就都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。可以看到,当输入50时,需要很长时间才能算出结果,这也说明递归的写法是非常低效的,可以发现,在展开的过程中,递归的过程中会有重复计算,而且递归层次越深,冗余计算越多。事实上,许多问题可以以递归的形式进行解释,这只是因为它比非递归的思路更加清晰,但是这些问题采用迭代实现的效率往往比递归实现的效率要高。原创 2023-08-13 22:03:02 · 60 阅读 · 7 评论 -
七、数组和函数实践:扫雷游戏
使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷 可以排查雷 如果位置不是雷,就显示周围有几个雷 如果位置是雷,就炸死游戏结束 ◦ 把除10个雷之外的所有雷都找出来,排雷成功,游戏结束原创 2023-08-07 23:51:56 · 181 阅读 · 7 评论 -
五、数 组
注意:变长数组的意思是数组的大小可以使用变量来指定,在程序运行的时候,根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的,数组的大小一旦确定就不能再变化了。从输出的结果来看,每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素之间也是差4个字节,所以⼆维数组中的每个元素都是连续存放的。⼀维数组元素都是内置类型的,如果把⼀维数组做为数组的元素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。原创 2023-08-02 20:38:58 · 47 阅读 · 2 评论 -
四、循环语句
首先执行 表达式1 初始化循环变量,接下来执行 表达式2 的判断部分, 表达式2 的结果如果 ==0,则循环结束;=0则执行循环语句,循环语句执行完后,再去执行 表达式 3 ,调整循环变量,然后再去 表达式2 的地⽅执行判断, 表达式2 的结果是否为0,决定循环是否继续。for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。原创 2023-07-28 21:53:46 · 71 阅读 · 3 评论 -
三、分支语句
上面的代码排版,让 else 和第⼀个 if 语句对其,让人以为 else 是和第一个if匹配的,当 if 语句不成立的时候,自然想到的就是执行 else 自居,打印 haha ,但实际上 else 是和第而个 if 进行匹配的,这样后边的 if…if语句为真,则打印成年了,if语句为假,则不打印,对于 printf(“可以谈恋爱了\n”),它是独立存在的,不管if语句的条件是否为真,都会被执行。在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是非0,则语句执行。原创 2023-07-28 21:38:43 · 75 阅读 · 7 评论 -
二、C语言数据类型和变量
(1)内置类型:C语言本身就具有的类型(2)自定义类型:本身不具有,可以自己创建的类型,比如可以创建描述学生的类型。原创 2023-07-28 19:57:26 · 121 阅读 · 5 评论 -
一、C语言常见概念
C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。• 关键字有特殊的意义,用于保留给C语⾔使用;• 程序员在创建标识符的时候不能和关键字重复;• 关键字不能自己创建。C语言的32个关键字如下:注:在C99标准中加⼊了 inline 、 restrict 、 _Bool 、 _Comploex 、 _Imaginary 等关键字。原创 2023-07-27 21:46:05 · 123 阅读 · 22 评论