![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 59
阿阿阿顺Yaya
热爱可抵道路漫长。
展开
-
整型变量和浮点型变量在内存中的存储问题
原码 - 直接将数据按照正负数的形式翻译成二进制即可反码 - 将原码的符号位不变,其它位按位取反得到补码 - 反码+1得到以上整数的三种表示方法均有和两部分,其中最高位是符号位(0表示正,1表示负),其它位都是数值位。如果是,那它的三种表示形式各不相同,而的原、反、补码都相同。为什么呢?原创 2023-02-28 12:04:24 · 102 阅读 · 1 评论 -
数据的存储练习题
前情提要:char在VS2019环境下是有符号char的类型,即signed char类型。本文代码的演示和运算的讲解过程皆是依据该环境。原创 2023-02-28 10:28:49 · 102 阅读 · 0 评论 -
看透【数组名】的小把戏(试题详解版)
在进行题目分析之前,需要先知道以下内容:数组名代表的是数组首元素的地址sizeof 计算的是对象所占内存的大小,单位是字节。原创 2023-02-26 10:02:39 · 63 阅读 · 3 评论 -
【杨辉三角】两种解法
从填的过程来看,我们在填第n行杨辉三角时,只跟第n-1行的杨辉三角产生联系,所以没必要保存每一行的杨辉三角,可以填一行打印一行,这样就能让空间复杂度从O(n^2)降低到O(n)。因为是打印整个杨辉三角,而不是取出其中的某一项,所以不可避免地要填出数据的每一项。按照题设的场景,根据规律:data[i][j]=data[i-1][j]+data[i-1][j-1],完成填表即可。这种方法虽然降低了空间复杂度,但是只能保存最后一行的数据,不利于反复查询。就本题而言,方法二会更好一点。原创 2023-02-25 10:04:05 · 49 阅读 · 1 评论 -
C语言文件操作总结
硬盘上的文件是文件。但在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)文件使用方式含义如果指定文件不存在“r”(只读)为了输入数据,打开一个已经存在的文本文件出错“w”(只写)为了输出数据,打开一个文本文件建立一个新的文件“a”(追加)向文本文件尾添加数据建立一个新的文件“rb”(只读)为了输入数据,打开一个二进制文件出错“wb”(只写)为了输出数据,打开一个二进制文件建立一个新的文件“ab”(追加)向一个二进制文件尾添加数据。原创 2023-02-21 11:13:25 · 79 阅读 · 5 评论 -
字符串旋转操作类两道题
其实abcde无论怎么旋转,旋转后的所有结果都包含在了abcdeabcde这个字符串里了。所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是两倍原字符串的子集即可。现将要左旋的前三个家伙逆序(cbadefg),然后将后半段也逆序(cbagfed),最后整体逆序(defgabc)即可。方法二需要用到一个数组形成的空间,为了能够在原字符串上进行操作,还可以有更好的选择。写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。实现一个函数,可以左旋字符串中的k个字符。原创 2023-02-19 11:16:54 · 58 阅读 · 3 评论 -
动态内存管理介绍
对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟的内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)在C99中,结构中的最后一个元素允许是未知大小的数组,这个就叫做【柔性数组】成员int num;double d;//柔性数组成员 };int num;double d;//柔性数组成员 };原创 2023-02-19 10:30:06 · 37 阅读 · 0 评论 -
《猜名次》问题超全进阶解析
以上所有方法都需要进行5^5次比较,而如果是做1~5的排列组合的话只需要5!所以将5个人,每个人从第1到第5名来一遍,根据排列组合规律,一共会产生5^5种结果,这需要一个5层循环来完成。但产生的所有结果中肯定会有不符合要求的结果出现,也就是抢名次的情况出现,所以还要做一个筛选,最后才能得到不会出现名次重复的排名结果。比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;原创 2023-02-18 10:10:16 · 234 阅读 · 0 评论 -
C语言结构体【内存对齐】与【实现位段】
跟结构相比,位段可以达到同样的效果,但是可以很好地节省空间,但是有跨平台的问题存在。原创 2023-02-17 12:16:15 · 75 阅读 · 0 评论 -
大小端字节序问题
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小段(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。原创 2023-02-17 08:21:29 · 52 阅读 · 0 评论 -
C语言字符分类和字符转换函数总结
【代码】C语言字符分类和字符转换函数总结。原创 2023-02-16 08:38:43 · 79 阅读 · 0 评论 -
C语言memcpy和memmove内存操作函数模拟实现
【代码】C语言memcpy和memmove内存操作函数模拟实现。原创 2023-02-16 08:23:13 · 113 阅读 · 0 评论 -
C语言字符(串)操作函数模拟实现
以上my_strcat函数的实现在面对字符串自己给自己追加的情况时,程序会崩溃;但是本程序所用编译器Visual Studio 2019中stract库函数可以完成自己给自己追加的情况。库函数的真实源码情况是无法知道的,本程序只是模拟实现。原创 2023-02-14 21:13:29 · 76 阅读 · 0 评论 -
C语言表达式求值中的【整形提升】与【算术转换】
C的整型算术运算中,表达式的字符和短整型操作数在使用之前被转换为普通整形进行运算。运行环境为Visual Studio 2019,该环境下char为有符号char//实例1 int main() {return 0;//实例2 int main() {char c = 1;return 0;int i;i --;输出结果:解释说明:i是全局变量,不初始化默认为0,i–后值为-1;原创 2023-02-14 10:53:13 · 96 阅读 · 0 评论 -
转移表(函数指针数组的使用)
转移表的使用可以有效减少代码的重复和冗余,使代码更加简洁;但同时有一定的形式需求,所以还需使用恰当。所以可以考虑设计一个函数指针数组,根据用户对应的选择,来调用相应的函数来完成需求。参数都是2个,且都是int型,返回值也都是int型。此处以计算器的例子来说明转移表的使用。原创 2023-02-12 20:38:33 · 82 阅读 · 0 评论 -
C语言快速排序【qsort函数】使用
当你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。所以回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。原创 2023-02-12 20:20:46 · 119 阅读 · 0 评论 -
你也能看懂的的函数栈帧创建与销毁
lea -> rep stos:四条指令的大致意思就是:将[ebp-0E4h]的地址加载到变量edi中,从edi指向的内存单元开始,向后(向高地址方向)所覆盖到的39h(其实就是从[ebp-0E4h]地址到ebp之间的区域)的内存单元,全部覆盖为0CCCCCCCCh的内容。要认识两个寄存器变量,ebp和esp,这两个变量中存放的是地址,是用来维护函数栈帧的,ebp是栈底指针,esp是栈顶指针,贯穿于函数栈帧创建和销毁的全过程(不懂寄存器也没关系,只要知道会用到ebp和esp这两个变量就行)原创 2023-02-12 11:39:48 · 113 阅读 · 0 评论 -
const的修饰使用方法
【代码】const的修饰使用方法。原创 2023-02-05 12:42:14 · 77 阅读 · 0 评论 -
扫雷【完整版】(C语言实现) —— 一篇就够了
如果输入的该坐标不是雷,且该坐标周围的8个坐标都不是雷,就可以进行递归展开,当遇到周围8个坐标中有雷的情况,就结束递归,返回周围8个坐标中雷的个数。简单说就是当定义的是10x10大小的棋盘,在玩的时候使用的只有8x8大小的棋盘,这一出神入化的想法所带来的好处,减轻了写代码时很多麻烦的工作量。【mark_board()】同时,为了提升玩的体验,增加了一个标记功能,玩家可以将已经推出的雷的位置进行标记,防止眼花缭乱。【布置雷】通过随机数和循环来生成指定数目的雷的个数,将其位置从‘0’修改为‘1’原创 2023-02-02 21:22:16 · 167 阅读 · 0 评论 -
青蛙跳台阶问题(C语言递归)
这样就可以得到f(n)=f(n-1)+f(n-2),这样就得到了程序运算的相似成分,也就是递归体。一只🐸一次可以跳1级台阶,也可以一次跳2级台阶,问这只🐸要跳上n级台阶,一共有多少种跳法?当n等于2时,🐸可以直接跳2级,或者连跳2个1级这两种跳法。如果🐸第一次跳1级台阶,剩下的台阶就有f(n-1)种跳法。如果🐸第一次跳2级台阶,剩下的台阶就有f(n-2)种跳法。假设🐸跳n级台阶一共需要f(n)种跳法,当n等于1时,🐸只有跳1级这一种跳法。我们可以很轻松地知道,那递归出口在哪里呢?原创 2023-01-31 20:45:22 · 165 阅读 · 2 评论 -
汉诺塔问题(C语言递归)
这个问题可以划分成两个自相似的部分,和一次移动。表示将A杆上的n个盘子经由B杆,放到C杆上来。将A杆上的n-1个盘子经由C杆移动到B杆。将B杆上的n-1个盘子经由A杆移动到C杆。将第n个盘子从A杆移动到C杆。原创 2023-01-31 20:23:02 · 51 阅读 · 0 评论 -
C语言实现简单三子棋(多子棋)游戏
【代码】C语言实现简单三子棋(多子棋)游戏。原创 2023-01-30 17:08:39 · 48 阅读 · 0 评论 -
Visual Studio 静态库的生成与使用
你就可以选择只暴露函数的声明部分,而将定义部分进行隐藏。使用者也只需要在使用的时候通过引用声明,明白函数的使用方法,而不需要了解内部的实现结构,并导入静态库,就可以直接进行使用。每个编译器厂商会根据C语言标准完成各种函数的实现供我们使用,比如微软开发的VS编译器,每当使用输入输出函数时,都要包含头文件,但具体的输入输出函数,如scanfprintf,它们的具体实现,不会直接暴露出来,而是以静态库的形式存在。虽然有些函数提供了参考代码,但也不一定是最终实现所用的源代码。原创 2023-01-29 18:30:55 · 1366 阅读 · 0 评论 -
C语言随机数的使用 —— 实现猜数字游戏
`time`函数的作用是获得当前计算机系统的时间,参数*timer*是`time_t`类型的,是用于存放当前系统时间的一片内存的指针,返回值是以秒为单位的时间,也为`time_t`类型(`time_t `类型在32位环境下是`long`类型,在64位环境下是64位的`int`类型),使用`time`函数时,需要包含头文件**time.h**。要注意的是返回的时间叫**时间戳**,它是以当前系统时间减去1970年1月1日午夜所原创 2023-01-13 20:38:51 · 446 阅读 · 0 评论 -
折半查找(二分查找)
针对如何在一个数组中进行目标元素查找的问题,这里介绍折半查找,并给出查找的两种形式。原创 2023-01-13 19:12:42 · 47 阅读 · 0 评论 -
用三段代码告诉你 while ((ch = getchar()) != ‘\n‘) 意义何在
第一段代码在执行后,会直接出现以下情况:这是因为在scanf函数读取数据时是会到内存的缓冲区中去拿,当输入 123456 按下回车后,会连带回车(‘\n’)一同被送到缓冲区,password在接受 123456 密码后,紧接着’\n’被getchar()获取到,并赋值给了变量ch,所以在if的判断中ch因为不等于字符’Y’,就直接执行了else操作。原创 2023-01-11 22:05:29 · 1752 阅读 · 3 评论 -
看透 static 的小把戏 ——一篇就够了
static 在C语言中是用来修饰变量和函数的修饰局部变量,此时被修饰的变量称为静态局部变量修饰全局变量,此时被修饰的变量称为静态全局变量修饰函数,此时被修饰的函数称为静态函数。原创 2023-01-10 21:45:12 · 47 阅读 · 0 评论 -
两招解除 Visual Studio 中的 _CRT_SECURE_NO_WARNINGS 报错
将“newc++file.cpp”文件拷贝一份到桌面;在VS中打开拷贝的“newc++file.cpp”文件,将这行代码:#define _CRT_SECURE_NO_WARNINGS 1添加到文件的第一行,保存并关闭。将桌面已被更改过的“newc++file.cpp”文件再拷贝一份,粘贴到上图文件的路径下原创 2023-01-09 22:45:22 · 670 阅读 · 0 评论