![](https://img-blog.csdnimg.cn/direct/a6facb7fe5ce43c1b5fa98ba723bca0f.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言
文章平均质量分 88
C语言学习专题
李白同学
少年没有乌托邦,心向远方自明朗!
展开
-
【C语言】编译和链接
在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。第2种是执行环境,它用于实际执行代码。2. 翻译环境那翻译环境是怎么将源代码转换为可执行的机器指令呢?这里我们就得展开讲解一下翻译环境所做的事情。其实翻译环境是由和两个大的过程组成的,而又可以分解成:预处理(有些书也叫预编译)、编译、汇编三个过程。一个C语言的项目中可能有多个文件一起构建,那多个文件如何生成可执行程序呢?原创 2024-03-30 15:49:14 · 1549 阅读 · 0 评论 -
【C语言】预处理
define reg register //为 register这个关键字,创建⼀个简短的名字;) //⽤更形象的符号来替换⼀种实现case //在写case语句的时候⾃动把 break写上。// 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏符)。思考:在define定义标识符的时候,要不要在最后加上;?建议不要加上;,这样容易导致问题。max = MAX;原创 2024-03-28 13:01:23 · 949 阅读 · 0 评论 -
【C语言】文件操作
上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。原创 2024-03-26 16:07:12 · 1651 阅读 · 0 评论 -
【C语言】动态内存管理
我们已经掌握的内存开辟方式有:但是上述的开辟空间的方式有两个特点:• 空间开辟大小是固定的。• 数组在申请的时候,必须指定数组的长度,数组空间⼀旦确定了大小不能调整。但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道,那数组的编译时开辟空间的⽅式就不能满⾜了。C语言引入动态内存开辟,让程序员自己可以申请和释放空间,就比较灵活了。C语言提供了⼀个动态内存开辟的函数:这个函数向内存申请⼀块连续可用的空间,并返回指向这块空间的指针。• 如果开辟成功,则返回⼀个指向原创 2024-03-25 16:45:36 · 1270 阅读 · 0 评论 -
【C语言】自定义类型:联合体和枚举
上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。联合体的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。在C语⾔中是可以的,但是在C++是不行的,C++的类型检查比较严格。{}中的内容是枚举类型的可能取值,也叫 枚举常量。原创 2024-03-22 13:00:47 · 1277 阅读 · 0 评论 -
【C语言】结构体内存对齐问题
我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何。原创 2024-03-20 13:01:04 · 1182 阅读 · 1 评论 -
【C语言】整数和浮点数在内存中的存储
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。原创 2024-03-17 16:21:01 · 1233 阅读 · 1 评论 -
【C语言】自定义类型:结构体
答案是不⾏的,因为Node是对前⾯的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使⽤Node类型来创建成员变量,这是不⾏的。仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤⼩就会⽆穷的⼤,是不合理的。3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。原创 2024-03-11 16:57:01 · 1333 阅读 · 0 评论 -
【C语言】qsort函数的使用
使用qsort函数排序整型数据。原创 2024-03-09 17:53:34 · 690 阅读 · 0 评论 -
【C语言】内存函数
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。• 如果source和destination有任何的重叠,复制的结果都是未定义的。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。原创 2024-03-08 11:05:19 · 868 阅读 · 1 评论 -
【C语言】左旋字符串(三种实现方式)
这时,我们可以这样理解,虽然我们旋转了4个字符,但我们实际上我们旋转了0个字符;依次类推,旋转5个字符,实际上旋转了1个字符;接下去也是如此......接下来,我们再把字符长度加长,变成abcde 5个字符,旋转 k = 5 个字符时,数组就回到了本身数组 abcde,后面的分析就跟4个字符分析是一样的。就是我们每一次旋转之前,我们就取出 arr 数组的首元素存放在 tmp 中,然后将 arr 数组剩余的每一个元素都往前移动一位,最后我们再把 tmp 中的元素放回 arr 数组末尾的位置。原创 2024-03-07 17:30:03 · 815 阅读 · 0 评论 -
【C语言】字符函数和字符串函数
这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。原创 2024-03-04 17:20:48 · 1334 阅读 · 1 评论 -
【C语言】sizeof和strlen的比较
1. sizeof和strlen的对比1. sizeof和strlen的对比1.1 sizeof在学习操作符的时候,我们学习了sizeofsizeof 是一个单目操作符, 绝对不是函数!!!sizeof 计算变量所占内存内存空间⼤⼩的,单位是字节。如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。运行结果:1.2 strlenstrlen是C语⾔库函数,功能是求字符串⻓度。统计的是从strlen。原创 2024-03-02 17:00:15 · 697 阅读 · 0 评论 -
【C语言】指针详细解读4
⾸先我们再次理解⼀下⼆维数组,⼆维数组其实可以看做是每个元素是⼀维数组的数组,也就是⼆维数组的每个元素是⼀个⼀维数组。所以,根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀维数组的地址。那就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,那么形参也是可以写成指针形式的。那么要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。原创 2024-03-01 19:30:00 · 1049 阅读 · 1 评论 -
【C语言】指针详细解读3
⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。4. ⼆级指针指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?这就是。原创 2024-02-29 08:48:44 · 1041 阅读 · 0 评论 -
【C语言】指针详细解读2
1.const 修饰指针1.const 修饰指针1.1 const修饰变量变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。编译结果:上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。原创 2024-02-27 10:56:21 · 1057 阅读 · 1 评论 -
【C语言】指针详细解读1
1. 内存和地址1. 内存和地址1.1 内存在讲述内存之前,我们先拿生活中的例子类比一下:假如我们要寻找酒店的一位朋友,首先我得知道以下一些信息:知道他是,知道酒店名,知道酒店房间号。就表示我们不能去找其他的东西:桌子、凳子等等,只能是是人。酒店名就表示我们只能在这个酒店去寻找,不能去其他地方寻找。房间号就表示我们去酒店的这个地方就能找到。我们把上述的例子对照到我们计算机中,就很好理解。原创 2024-02-26 15:19:57 · 1276 阅读 · 2 评论 -
【C语言】操作符详解
8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的最左侧补0换算。表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。原创 2024-02-20 18:07:01 · 1039 阅读 · 0 评论 -
【C语言】函数递归
函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。当我们n输⼊为50的时候,需要很⻓时间才能算出结果,这个计算所花费的时间,是我们很难接受的, 这也说明递归的写法是⾮常低效的,那是为什么呢?事实上,我们看到的许多问题是以递归的形式进⾏解释的,这只是因为它⽐⾮递归的形式更加清晰, 但是这些问题的迭代实现往往⽐递归实现效率更⾼。直到⼦问题不能再被拆分,递归就结束了。原创 2024-02-15 10:55:39 · 1030 阅读 · 1 评论 -
【C语言】如何写一个扫雷游戏
①如果位置不是雷,就显⽰周围有⼏个雷②如果位置是雷,就炸死游戏结束③把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束。原创 2024-02-13 14:25:37 · 1237 阅读 · 1 评论 -
【C语言】函数
函数的概念。原创 2024-02-04 15:45:17 · 1049 阅读 · 1 评论 -
【C语言】简单操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”(relational expression),⾥⾯使⽤的运算符就称为“关系运算符”(relational operator),主要有下⾯6个。⼤于运算符⼩于运算符•>=⼤于等于运算符• 12返回112 > 20返回0。关系表达式常⽤于。原创 2024-02-03 12:03:39 · 911 阅读 · 1 评论 -
【C语言】break和continue的使用
简述:在循环执行的过程中,如果某些状况发⽣的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了和两个关键字,就是应⽤到循环中的。的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。原创 2024-02-01 19:04:41 · 3912 阅读 · 1 评论 -
【C语言】一维数组和二维数组
①等,也可以自定义的类型;②指的是数组名的名字,这个名字根据实际情况,自己定义即可;③中的常量值是⽤来指定数组的⼤⼩的,这个数组的⼤⼩是根据实际的需求指定就⾏;原创 2024-01-29 12:00:52 · 1314 阅读 · 0 评论 -
【C语言】分支和循环语句
例子:输入一个整数,判断是否为奇函数。原创 2024-01-27 18:46:59 · 998 阅读 · 0 评论