
c语言
文章平均质量分 87
C语言知识,如各类语句,循环,操作符,函数,指针,结构体等
zkf&
一名散修程序员
展开
-
【C语言】【数据结构】项目实践——贪吃蛇游戏(超详细)
前言本篇博客我们来实现一个小游戏项目——贪吃蛇,相信肯定很多人都玩过,那么整个贪吃蛇是怎么实现出来的那,这个项目用到了很多方面的知识:C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。我们就通过这篇博客一步一步去分析,实现贪吃蛇。若有问题 评论区见📝。原创 2024-04-19 21:08:27 · 6683 阅读 · 114 评论 -
【C语言】预处理详解
除非宏比较短,否则可能大幅度增加程序的长度,如果不断调用这个宏,那程序长度不断增大,空间也会增大,反之函数永远调用的是那一块空间函数,在这个方面函数比较简便。整体代码如上图,这个代码非常巧妙地用宏来函数定义,只需将类型传进去,这个##就是用来将左右两个标识符合并成一个标识符,type改变,那对应的type_max也发生改变,这样就能有不同的函数名字。第一个x++是5,第一个y++是8,5原创 2024-03-31 19:16:35 · 2451 阅读 · 46 评论 -
【C语言】编译与链接
翻译环境和运行环境前言我们想一个问题,我们写的C语言代码都是文本信息,电脑能直接执行c语言代码吗?肯定不能啊,计算机能执行的是二进制指令,所以将C语言转化为二进制指令需要一段过程,这篇博客讲一下编译与链接,来一起探讨C语言是如何转化为二进制指令的。若有问题 评论区见感兴趣就关注一下吧。原创 2024-03-29 19:22:21 · 1525 阅读 · 34 评论 -
【C语言】文件操作
磁盘(硬盘)上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。1.1程序文件程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。1.2 数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本章讨论的是数据文件。原创 2024-03-28 12:33:40 · 2543 阅读 · 66 评论 -
【C语言】动态内存的管理
首先我们要搞清楚什么是动态内存的分配?平常我们定义的数组,都是在栈区分配的空间,都是分配的空间都是固定的大小这种分配固定大小的内存分配方法称之为静态内存分配与静态内存相对的,就是可以控制内存的分配的动态内存分配注意:这里动态内存分配的空间是在堆区申请的,不是在栈区申请的我们再来看看内存各个空间都是什么1.栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。原创 2024-03-24 22:13:01 · 1897 阅读 · 53 评论 -
【C语言】联合体和枚举
前言这篇博客就把剩下的两个自定义类型联合体和枚举好好总结一下,让我们好好看看联合体和枚举到底是什么若有问题 评论区见感兴趣就关注一下吧1.联合体1.1联合体类型的声明像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。。给联合体其中一个成员赋值,其他成员的值也跟着变化。include//联合类型的声明unionUncharc;inti;原创 2024-03-23 13:38:45 · 1717 阅读 · 52 评论 -
【C语言】结构体
记住这个是位段,不是我们游戏中的段位!!!哈哈哈开玩笑回到正题,位段其实是一种特殊的结构体位段的声明和结构是类似的,有两个不同:1.位段的成员必须是int或signed int,在C99中位段成员的类型也可以选择其他类型。2.位段的成员名后边有一个冒号和一个数字。后面那个数字就是给你这个数所占的比特位举一个例子structAint_a:2;int_b:5;int_c:10;int_d:30;A就是一个位段类型。7.2位段的内存分配1.原创 2024-03-20 15:15:17 · 1702 阅读 · 28 评论 -
【C语言】数据在内存中的存储
字节序——是以字节为单位,来讨论存储顺序的其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。原创 2024-03-16 16:18:31 · 1531 阅读 · 24 评论 -
【C语言】内存函数
前言上篇博客我们分析了字符函数和字符串函数,这篇咱们就来看看内存函数若有问题,评论区见感兴趣就关注一下吧。原创 2024-03-14 20:46:11 · 1631 阅读 · 17 评论 -
【C语言】字符函数和字符串函数
前言今天这篇博客咱们一起来认识一些特殊的函数,在编程的过程中我们经常要处理字符和字符串,为了方便字符和字符串,C语言提供了一些库函数,让我们一起看看这些函数都有什么功能吧!!!若有问题 评论区见感兴趣就关注一下吧。原创 2024-03-12 22:21:44 · 1481 阅读 · 22 评论 -
【C语言】指针总结(完结篇)
前言这篇博客终于迎来了指针博客的大结局,本篇主要分析习题来回顾之前的指针总结的知识点,这篇博客的题有点绕,哈哈算是经典了若有问题 评论区见感兴趣就关注一下吧。原创 2024-03-07 14:12:23 · 1559 阅读 · 14 评论 -
【C语言】qsort函数介绍
前言学到了函数指针,那这篇博客我们可以根据函数指针,了解一个函数qsort的应用与模拟实现若有疑问 评论区见。原创 2024-03-05 09:42:13 · 1390 阅读 · 12 评论 -
【C语言】指针总结3
本篇博客继续总结有关指针的知识。原创 2024-02-28 20:10:26 · 1168 阅读 · 23 评论 -
【C语言】指针总结2
本篇博客紧接着指针总结1来总结下数组和指针的关系,让我们一起来看一下数组与指针的“爱恨情仇”。原创 2024-02-27 17:47:48 · 1276 阅读 · 13 评论 -
【C语言】指针总结1
指针这一部分的知识是重中之重,我打算分几篇博客写完来更加详细的理解指针。原创 2024-02-24 20:52:29 · 783 阅读 · 7 评论 -
【C语言】函数栈帧的创建和销毁(逐步分析)
我们通过push将当时edp在主函数栈底的地址压栈到一个空间,当我们返回指向这个空间是就能读取到主函数栈底的位置,再读取通过call指令存放下一个指令的地址,就直接返回主函数的栈帧里,返回值是通过寄存器存储,保护数据在调用的函数栈帧销毁时不丢失,再通过寄存器将值放入对应的主函数空间。接着是ret指令,意思是返回到main函数,返回到call指令,而call指令储存的是下一个指令的地址,所以直接返回main函数call指令下一个指令也就是a传参的空间。那函数是如何调用的?函数的返回值又是如何返回的?原创 2024-02-08 19:18:19 · 959 阅读 · 2 评论 -
【C语言】操作符超详细总结
• 算术操作符: + 、- 、* 、/ 、%• 移位操作符: >• 位操作符: & | ^• 赋值操作符: = 、+= 、 -= 、 = 、 /= 、%= 、= 、&= 、|= 、^=• 单目操作符: !、++、–、&、、+、-、~ 、sizeof、(类型)• 关系操作符: > 、>= 、< 、其实我原创 2024-02-06 16:49:45 · 1635 阅读 · 1 评论 -
【C语言】函数递归例子2青蛙跳台阶问题
我们先假设有n个台阶,如果n=1,那么只有一种跳法,如果n=2,那么就有两种跳法。如果n=3,若第一次跳一阶,那么第二次跳二阶,若第一次跳二阶,那么第二次跳一阶,有两种情况,因此跳三个台阶时相当于先分类再相加前两种情况。虽然斐波那契数和青蛙跳台阶很相似,但当n=2时,斐波那契数是1,而青蛙跳台阶是2种跳法,所以,从这里开始斐波那契数列是1,1,2,3……所以当有n个台阶时,假如青蛙第一次跳了1个台阶,那么剩下了n-1个台阶。那我们是不是可以这么想跳n个台阶的跳法=跳n-1个台阶跳法+跳n-2个台阶跳法。原创 2024-02-04 18:33:59 · 827 阅读 · 1 评论 -
【C语言】函数递归例子1汉诺塔问题
昨天我总结函数递归说到了两个例子,今天我们就来看一下其中之一汉诺塔汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。2020年8月3日,夏焱以33.039秒的成绩成功打破6层汉诺塔吉尼斯世界纪录。2021年5月16日,中国龙岩的陈诺以29.328秒原创 2024-02-04 16:23:44 · 892 阅读 · 3 评论 -
【C语言】函数递归总结
递归其实是一种解决问题的方法,在C语言中,递归就是函数自己调用自己。//main函数中⼜调⽤了main函数return 0;上述就是一个简单的递归程序,只不过上面的递归只是为了演示递归的基本形式,不是为了解决问题,代码最终也会陷入死递归导致栈溢出(Stackoverflow)。原创 2024-02-03 18:29:18 · 1074 阅读 · 1 评论 -
VS实用调试技巧
bug本意是“昆虫”或“虫子”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或问题,简称程序漏洞。“Bug” 的创始人格蕾丝·赫柏(Grace Murray Hopper),她是⼀位为美国海军工作的电脑专家,1947年9月9日,格蕾丝·赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术⼈员正在进行整机运行时,它突然停止了工作。原创 2024-01-31 22:40:02 · 1470 阅读 · 0 评论 -
【C语言】关键字static和extern详细总结
作用域和生命周期。作用域(scope)是程序设计概念,通常来说,⼀段程序代码中所用到的名字并不总是有效可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。1.局部变量的作用域是变量所在的局部范围。2.全局变量的作用域是整个工程(项目)。生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。1.局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。2.全局变量的生命周期是:整个程序的生命周期。原创 2024-01-30 15:11:53 · 1030 阅读 · 1 评论 -
【C语言】函数超详解总结
了解了库函数,我们的关注度应该聚焦在自定义函数上,自定义函数其实更加重要,也能给程序员写代码更多的创造性。原创 2024-01-29 23:32:28 · 1354 阅读 · 2 评论 -
【C语言】数组总结
从输出的结果来看,每⼀行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,学习了⼀维数组的基本语法,⼀维数组可以存放数据,存放数据的目的是对数据的操作,那我们如何使用⼀维数组呢?前面学习的数组被称为⼀维数组,数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元。存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。中的常量值是⽤来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。原创 2024-01-28 17:19:03 · 1029 阅读 · 3 评论 -
【C语言】扫雷游戏
左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。储存两个棋盘的信息,第一个棋盘是布置雷的棋盘(客户看不到的),第二个是排查雷的棋盘(客户能看到并能操作的棋盘),数组的行和列虽说是9*9的棋盘,但存在边角也有可能是雷的情况来计算,所以实际数组行。你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。原创 2024-01-28 14:30:10 · 528 阅读 · 2 评论 -
【C语言】三子棋游戏
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。2.创建一个游戏函数game用来记录游戏步骤,并初始化棋盘并打印棋盘,创建俩函数,一个用来初始化qipan,一个用来打印棋盘disqipan。6.判断双方胜利的条件,并创建一个判断平局的函数isfull。5判断结果,创建一个函数iswin来判断双方胜利。原创 2024-01-25 22:57:53 · 444 阅读 · 2 评论 -
【C语言】scanf()与printf()详细介绍
scanf() 函数用于读取用户的键盘输入。程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据、按下回车键后,scanf()就会处理用户的输入,将其存入变量。它的原型定义在头文件stdio.h。它的第⼀个参数是⼀个格式字符串,里面会放置占位符(与printf()的占位符基本⼀致),告诉编译器如何解读用户的输入,需要提取的数据是什么类型。这是因为 C 语言的数据都是有类型的, scanf()原创 2024-01-25 16:36:44 · 1212 阅读 · 0 评论 -
【C语言】分支与循环
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下⼀次,表达式为假,则不再继续循环。=0则执行循环语句,循环语句执行完后,再去执行表达式 3 ,调整循环变量,然后再去 表达式。⾸先上来就是执行判断表达式,表达式的值为0,循环直接结束;循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的。原创 2024-01-23 22:52:27 · 1088 阅读 · 1 评论 -
【C语言】猜数字游戏
猜数字游戏1~100代码。原创 2024-01-22 12:15:35 · 438 阅读 · 0 评论 -
【C语言】操作符总结
在变量创建的时候给一个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。是⼀个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字。运算符的返回值,C 语言只规定是无符号整数,并没有规定具体的类型,而是留给。异或的计算方法:对应的二进制相同,则为0;当exp1为真时,执行exp2,当exp1为假时,执行exp3。负数求模的规则是,结果的正负号由第一个运算数的正负号决定。除号的两端如果是整数,执行的是整数除法,得到的结果也是。3.单目操作符:++,--,+(正),-(负)原创 2024-01-21 21:23:12 · 415 阅读 · 0 评论 -
【C语言】数据类型和变量
使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。C语言中把经常变化的值称为变量,不变的值称为常量。每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。全局变量的使用范围更广,整个工程中想用,都是有办法使用的。当局部变量和全局变量同名的时候,局部变量优先使用!原创 2024-01-21 16:20:24 · 487 阅读 · 3 评论