C语言
文章平均质量分 85
大力初奇迹
这个作者很懒,什么都没留下…
展开
-
编译和链接
我们在 test.c 文件中每一次使用 Add 函数和 g_val 的时候必须确切的知道 Add 和 g_val 的地 址,但是由于每个文件是单独编译的,在编译器。将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列 的记号(关键字、标识符、字面量、特殊字符等)。在 gcc 环境下想观察⼀下,对 test.c 文件预处理后的.i文件,命令如下: 1 gcc -E test.c -o test.i。,所以暂时把调用 Add 的指令的目标地址和 g_val 的地址。原创 2024-03-31 20:27:07 · 1400 阅读 · 22 评论 -
fread和fwirte函数
返回值:如果成功,读取的总字节数为 (size*count),返回。fwrite和fread的理解差不多,这里就不多做阐述啦!参数不同,则表示读取时发生读取错误或到达。在这两种情况下,可以分别使用。从流(二进制文件)中读取数据块。为size,并将它们存储在。size 或 count。个元素的数组,每个元素的。指向的流状态和内容保持。原创 2024-03-31 19:08:49 · 595 阅读 · 2 评论 -
文件的顺序读写——顺序读写函数——fgets、fgetc、fputs、 fputc
一、fgetc和fputc函数一、fgetc和fputc函数1.1 fputc返回类型int:如果成功读取字符,返回的是字符的ASCII码值——char如果读取失败或者遇文件末尾,则返回EOF(-1) ——int为了统一,将函数的返回类型定为int(char类型提升为int类型)原创 2024-03-30 23:54:06 · 1473 阅读 · 7 评论 -
文件的打开和关闭
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。一般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。原创 2024-03-30 20:36:53 · 400 阅读 · 3 评论 -
strcat与strncat函数使用与模拟实现
【代码】strcat与strncat函数使用与模拟实现。原创 2024-03-27 08:21:07 · 172 阅读 · 0 评论 -
拿下大怪兽——指针
二维数组传参,形参的部分可以写成数组,也可以写成指针形式。原创 2024-03-27 08:20:38 · 874 阅读 · 4 评论 -
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
数据在内存中以补码形式存储。题目要求我们求一个数在内存中二进制中1的个数,从这里可以想到,我们需要定义一个变量count来计数,再得到二进制的每一位,并且再判断它是否为1,这道题就差不多解决了。但问题就是如何得到二进制的每一位?我们知道二进制的每一位要么是0要么是1,因此求二进制中1的个数,只需%2,看得到的余数是不是1,如果是1,count++,之后/2使得这个二进制去掉最后一位,如此循环往复,直到该数字为0,count的值就是1的个数。课外练习:用位运算判断一个数是否是2的次方数;二进制位置0或者置1原创 2024-03-23 08:51:05 · 715 阅读 · 1 评论 -
结构体内存对齐
1.结构体的第一个成员对齐到和结构体变量起始位置的地址处2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数= 编译器默认的一个对齐数与该成员变量大小的。VS 中默认的值为 8Linux中 gcc 没有默认对齐数,对齐数就是成员自身的大小3.为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的 整数倍。4. 如果嵌套了结构体的情况,嵌套的结构体成员对齐到的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体中成员的对齐数)的整数倍。原创 2024-03-23 08:49:53 · 472 阅读 · 0 评论 -
浮点数在内存中的存储
常见的浮点数:3.14159、1E10等,浮点数家族包括: float、double、long double 类型。浮点数表示的范围: float.h 中定义根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:• M表示符号位,当S=0,V为正数;当S=1,V为负数(−1)• S表是有效数字,M是大于等于1,小于2的• E表示指数位举例来说:十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2。原创 2024-03-18 08:31:57 · 1234 阅读 · 2 评论 -
数据在内存中的存储之整数存储
整数的2进制表示方法有三种,即原码、反码和补码三种表示方法均有和两部分,符号位都是0表用示“正”,用1表示“负”,而最高的一位是被当做符号位,剩余的都是数值位。原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。补码:反码+1就得到补码。对于整形来说:数据存放内存中其实存放的是补码。为什么呢?在计算机系统中,。原因在于,使用补码,可以将符号位和数值域统⼀处理;原创 2024-03-18 07:42:45 · 755 阅读 · 2 评论 -
【C语言】strcpy与strncpy函数的使用和模拟实现
• 源字符串必须以 '\0' 结束。• 会将源字符串中的 '\0' 拷贝到目标空间。• 目标空间必须足够大,以确保能存放源字符串。• 目标空间必须可修改。strcpy 不检查目标缓冲区的大小,因此如果目标缓冲区不够大,可能会导致缓冲区溢出,这是一个严重的安全风险。建议使用 strncpy并指定最大复制长度,以避免这种风险。原创 2024-03-17 11:25:12 · 353 阅读 · 2 评论 -
【C语言】字符分类函数与字符转换函数
C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使用都需要包含⼀个头文件是ctype.h这些函数的使用方法非常类似,我们就讲解⼀个函数的事情:islower 是能够判断参数部分的 c 是否是小写字母的。通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。原创 2024-03-17 10:44:43 · 426 阅读 · 1 评论 -
【C语言】如何规避野指针
对于指针也是,在使用之前,我们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是,不能直接使用;如果不是,我们再去使用。我们可以把野指针想象成野狗,野狗放任不管是非常危险的,所以我们可以找⼀棵树把野狗拴起来,就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓前来,就是把野指针暂时管理起来。NULL 是C语言中定义的⼀个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以给指针赋值NULL.原创 2024-03-12 22:34:57 · 577 阅读 · 0 评论 -
【C语言】初步解决指针疑惑
计算机CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。简记为:8bit —> 8 二进制 —> 1字节 —> 2个十六进制,有了该编号,CPU就可以快速找到一个内存空间。该编号也叫做地址,C语言给。原创 2024-03-12 22:33:41 · 716 阅读 · 0 评论 -
操作符详解3
前面我们已经讲过算术操作符、赋值操作符、逻辑操作符、条件操作符和部分的单目操作符,今天继续介绍一部分。原创 2024-02-25 21:00:29 · 1188 阅读 · 6 评论 -
操作符的属性:优先级、结合性(缺表达式求值)
C语言的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序。我们先简单了解一下操作符的优先级和结合性,附上表格,简单记一下顺序,搭配几道题来加深印象。原创 2024-02-23 19:11:14 · 872 阅读 · 0 评论 -
【原码、反码、补码】小白看完都呲大牙
所以,在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。写作不易,您的支持给与我莫大的鼓励!!!原创 2024-02-22 10:04:42 · 1700 阅读 · 0 评论 -
【表达式求值】整型提升和算术转换
即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径,那这个表达式就是存在潜在风险的,建议不要写出特别复杂的表达式。只有一点小小归纳,希望能帮到大家!!!!原创 2024-02-21 21:08:12 · 1097 阅读 · 0 评论 -
【C语言】初步认识结构体
/代码1:变量的定义int x;int y;//x,y是成员变量}p1;//声明类型的同时定义变量p1//定义结构体变量p2//代码2:初始化。struct Stu //类型声明//名字int age;//年龄//初始化//指定顺序初始化//代码3int data;//结构体嵌套初始化//结构体嵌套初始化。原创 2024-02-20 13:55:34 · 518 阅读 · 0 评论 -
二进制和进制转换
非十进制转十进制:权重之和十进制转二进制:短除法二进制转八进制: 从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。二进制转十六进制:从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位,剩余不够4个二进制位的直接换算。原创 2024-02-17 14:32:13 · 961 阅读 · 0 评论 -
函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数
当 n==0 的时候,n的阶乘是1,其余n的阶乘都是可以通过公式计算。n的阶乘的递归公式如下:原创 2024-02-16 22:33:27 · 1362 阅读 · 1 评论 -
数一下 1到 100 的所有整数中出现多少个数字9并输出这些数字
而这里99首先满足 i % 10 == 9 的判断条件,所以执行完相应语句后,就到for循环的调整语句(i++),没有进入else语句。从运行结果看出,99少算了一次,对比前一个代码,发现差别仅有分支结构(if-if、if-else if)。从这里可以看出,99是算了两次的,所以数字9的出现次数是20。思考, 1234想到得到4、12和123如何实现?1234 / 100 //得到12。1234 / 10 //得到123。1234 % 10 //得到4。原创 2024-01-06 09:00:00 · 469 阅读 · 1 评论 -
嵌套调用和链式访问
嵌套调⽤就是函数之间的互相调⽤,每个函数就是⼀个乐⾼零件,正是因为多个乐⾼的零件互相⽆缝的配合才能搭建出精美的乐⾼玩具,也正是因为函数之间有效的互相调⽤,最后写出来了相对⼤型的程序。假设我们计算某年某⽉有多少天?这⼀段代码,完成了⼀个独⽴的功能。代码中反应了不少的函数调⽤:• main 函数调⽤ scanf 、 printf 、 get_days_of_month• get_days_of_month 函数调⽤ is_leap_year稍微⼤⼀些代码都是函数之间的嵌套调⽤,但是。原创 2024-01-05 12:18:48 · 925 阅读 · 1 评论 -
static和extern详解
static修饰局部变量:生命周期就和程序的生命周期一样,只有程序结束,变量才销毁,内存才回收。但是作用域不变。static修饰全局变量:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。⼀个函数在整个工程都可以使用,被static修饰后,只能在本文件内部使用,其他文件无法正常的链接使用了。期待。原创 2024-01-04 10:31:56 · 3483 阅读 · 3 评论 -
猜数字游戏
1. 电脑自动生成1~100的随机数2. 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。原创 2024-01-03 12:12:03 · 894 阅读 · 1 评论 -
逗号表达式与赋值表达式
逗号表达式、赋值表达式、及其易混淆点。原创 2024-01-02 01:47:43 · 3610 阅读 · 0 评论 -
打印9*9乘法口诀
1.设计函数原型,不需要返回值,参数n表示乘法口诀表总共有多少行2.设定两个循环外层循环控制总共有多少行内层循环控制每行有多少个表达式以及表达式中的内容i原创 2024-01-01 15:39:13 · 780 阅读 · 0 评论 -
C语言之scanf浅析
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读用户的输入,需要提取的数据是什么类型。上面示例中,格式字符串 %d%d%f%f ,表示用户输⼊的前两个是整数,后两个是浮点数,⽐如 1 -20 3.4 -4.0e3。%d 就是⼀个占位符,• %[] :在方括号中指定⼀组匹配的字符(数字字符,比如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止。,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,后面的字符将被丢弃。原创 2023-12-31 11:18:53 · 2767 阅读 · 2 评论 -
C语言之printf浅析
printf的初步讲解、占位符有哪些、打印指定的小数点位数、限定最小宽度、输出部分字符串、输出总显示正负号。原创 2023-12-30 00:04:09 · 1080 阅读 · 1 评论 -
C语言操作符2
在这篇文章中,主要讲解关系操作符、条件操作符、逻辑操作符,及其短路。原创 2023-12-29 09:19:52 · 971 阅读 · 1 评论 -
C语言之操作符1
在表达式中,常常使用到各种操作符(也被称为运算符)。在这里详细讲解关系操作符、条件操作符、逻辑操作符会在后期讲解。原创 2023-12-28 13:41:22 · 981 阅读 · 1 评论 -
C语言之数组
相同类型元素的集合数组分为一维数组和多维数组,多维数组一般是比较常见的二维数组。数组在内存中是连续存放的,随着下标的增长,地址由小到1大变化。原创 2023-12-27 12:04:52 · 991 阅读 · 1 评论 -
数组练习之二分查找和多个字符从两端向中间汇聚
上述代码打印结果是一瞬间的。经过下述改良之后,打印结果有时间间隔,且会清理上次打印结果,给人一种逐步打印的感觉,也展示了多个字符从两端移动,向中间汇聚的整体过程。宝宝们下来可以尝试一下。在一个升序数组中查找指定的数字n,很容易想到的就是遍历数组。定义两个字符数组,将要移动的字符数组元素赋值给另一个数组元素,实现多个字符行两端向中间汇聚。下述代码会停顿1s打印:(Sleep函数可以控制程序的执行速度,该函数的参数类型为。当是n个元素时,最坏的情况找了n次,效率低。而当我们折半查找效率就提高了很多。原创 2023-12-26 20:17:49 · 547 阅读 · 1 评论 -
sizeof,sizeof与strlen的区别
sizeof是一个关键词也是操作符,专门用来计算类型或者变量大小,其实sizeof也可以计算数组的大小,单位都是字节。sizeof操作符的操作数可以是类型,也可以是变量或者表达式。sizeof(类型)sizeof 表达式sizeof运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof到底返回什么类型。原创 2023-12-25 12:06:36 · 935 阅读 · 1 评论 -
C语言之循环语句
while语句的语法结构和if语句的语法结构非常相似。原创 2023-12-24 15:29:22 · 796 阅读 · 1 评论 -
break与continue详解
在循环执行的过程中,如果发生某些状况的时候,需要提前终止循环,这是非常常见的现象。C语言提供了break和continue两个关键字,就是应用到循环中的。break永久的终止循环continue跳过本次循环continue。原创 2023-12-23 16:47:51 · 3840 阅读 · 1 评论 -
C语言之语句和语句的分类
以实现程序的各种结构方式(C语言支持三种结构:顺序结构,选择结构,循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。(详细内容看博主这篇文章:https://mp.csdn.net/mp_blog/creation/editor/134805824)(不了解库函数和自定义函数的,可以看看博主的这篇文章。成对括号中的代码就构成了一个代码块,也称作复合语句。复合语句就是代码块。函数调用的时候,也会加上分号。(return语句注意事项。表达式的后边加上分号。,就是函数调用语句。原创 2023-12-22 15:45:36 · 1040 阅读 · 0 评论 -
保姆级别的扫雷游戏
使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷如果位置不是雷,就显示周围有几个雷如果位置是雷,就炸死,游戏结束把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束。原创 2023-12-21 22:33:04 · 907 阅读 · 3 评论 -
震惊!!!return 语句居然是这样的
在函数的设计中,函数中经常会出现return语句,这里讲一下return语句的使用注意事项。原创 2023-12-17 23:15:55 · 303 阅读 · 0 评论 -
C语言之分支结构
在c语言中,0为假,非0表示真。表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行。if语句和switch语句的理解和模板。原创 2023-12-05 16:39:52 · 479 阅读 · 3 评论