![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 78
'Skrrapper
C/C++领域创作者、CSDN校园主理人、阿里云专家博主
编程之大,无奇不有。让我们共同学习,一起进步!
展开
-
编译和链接
同时,链接器会调整 main.o 和 helper.o 中 global_var 的地址,以确保它们在内存中的位置是正确的。(1) 符号解析:在链接阶段,链接器会解析目标文件中的符号(如变量名、函数名等),并将其与其定义所在的目标文件或库文件进行关联。(2)符号重定位: 在链接过程中,链接器会根据目标文件中的重定位信息,将各个目标文件中的代码段和数据段进行合并,并调整各个符号在内存中的地址。在进行完编译之后,合法的源代码就会进行汇编器进行语言的转换,会将高级语言的代码转换机器代码,也就是二进制指令。原创 2024-04-03 12:54:41 · 752 阅读 · 0 评论 -
C语言(16)----预处理中的宏以及预处理指令
一般来说宏可以定义常量也可以定义变量。//name和左括号要紧密相邻注意:一般在语句的最后不会加上分号;//打印出来为以下://123;;而对于某些函数语句例如if、while,更有可能出现语法错误。max = MAX;原创 2024-04-02 12:17:12 · 806 阅读 · 0 评论 -
文件的介绍
文件是计算机中用于存储数据的一种载体。一般储存在磁盘上。文件通常以一定的格式和结构存储数据,可以包含文本、图像、音频、视频等各种类型的信息。文件可以通过文件系统进行管理和组织,用户可以对文件进行创建、打开、编辑、保存、复制、移动、删除等操作。常见的文件格式包括等。文件在计算机中起着非常重要的作用,是信息传递和存储的基本单位。在程序设计中,我们把文件一般分为两类,一类是程序文件,一类是数据文件。原创 2024-03-26 11:30:54 · 1251 阅读 · 2 评论 -
C语言(15)----动态内存讲解
动态内存区分于静态内存,理论上就是大小可以动态变化的内存存储方式。静态内存空间开辟的大小是固定的,这会导致内存中只能存放指定的大小,不能调整。那么动态空间分配的出现,使得程序员可以自行更改内存的大小,让程序更加灵活和方便。原创 2024-03-06 14:39:54 · 1036 阅读 · 0 评论 -
C语言(14)----柔性数组
在结构体中,最后一个元素为可变长度的数组,这个数组叫做柔性数组struct Strint i;char x;int a[];//柔性数组}type_a;原创 2024-03-06 14:39:34 · 462 阅读 · 0 评论 -
C语言(13)----联合和枚举
联合体(union)是一种特殊的数据类型,可以在同一内存空间中存储不同类型的数据。联合体和结构体(struct)类似,但不同之处在于结构体的各个成员会分别占用内存空间,而联合体的各个成员共享同一内存空间。鉴于这个特性,联合体也叫做共用体。原创 2024-02-26 17:01:09 · 241 阅读 · 0 评论 -
C语言(12)----结构体
结构体是用户自定义的一种类型,它使用关键字struct来定义结构体。原创 2024-02-17 13:08:17 · 1333 阅读 · 2 评论 -
数据存储以及内存
数据在内存中的存储是因不同的类型而不同的。但首先我们需要知道的是,在C语言中,数据在内存中的存储是以变量的形式存储的。每个变量都有一个地址,指向内存中的特定位置。变量的值存储在这个地址对应的内存单元中。不同类型的变量在内存中占据不同大小的空间,例如整数型变量通常占据4个字节的空间,而字符型变量通常占据1个字节的空间。所以说实际上数据的存储也是由于类型所占字节不同而改变的。接下来分别对不同类型的存储进行介绍。原创 2024-02-14 14:37:46 · 731 阅读 · 0 评论 -
C语言(11)----内存函数
内存函数主要用于动态分配和管理内存,它直接从指针的方位上进行操作,可以实现字节单位的操作。其包含的头文件都是:string.h。原创 2024-02-09 13:56:52 · 3671 阅读 · 0 评论 -
C语言(10)----字符函数和字符串函数
C语言中字符和字符串的使用非常之多。为了提高代码的效率以及精简代码,C语言规定了一系列的字符函数和字符串函数。接下来对常用的函数进行介绍。原创 2024-02-05 16:52:43 · 1308 阅读 · 0 评论 -
C语言(9)----NULL、null(或者NUL)、\0、0、‘0’几者之间的区别
本质也是0,在C语言中,NULL是一个宏定义,通常被定义为一个空指针常量(通常是0或者(void *)0)。它通常用于表示一个空指针,即指向没有特定对象的指针。所以一般用于指针初始化。表示空字符,是一种转义字符,在字符串中,用它来表示字符串的结束。通常指的是空字符或者空指针,实质上的作用相当于\0。表示字符0,它的ASCII码值是48。null(或者NUL)原创 2024-02-04 11:44:54 · 143 阅读 · 0 评论 -
指针(7)---*和&的区别
在C语言中,和都是用于操作指针的符号。是取地址运算符,用于获取变量的内存地址。例如,&a表示变量a的地址。是指针运算符,用于获取指针所指向的变量的值,也就是我们常说的解引用。例如,*ptr表示指针ptr所指向的变量的值。因此,&和*是互为逆运算的符号,&用于获取变量的地址,*用于获取地址所指向的变量的值。在这里我们可以运用strlen和sizeof所对应的数据的打印来辨别其不同。原创 2024-02-02 17:19:31 · 685 阅读 · 0 评论 -
C语言(8)----长度计算方法:sizeof与strlen的对比
sizeof是用来计算内存大小的一种操作符,它只计算内存的大小,无论内存中存放的是什么类型的数据。单位:字节为什么答案都是4呢?因为sizeof是不看内容的,就算a=100000,只要它的类型是int,那么计算出的也只是一个int类型所占的字节大小也就是4。原创 2024-01-25 15:40:56 · 384 阅读 · 0 评论 -
指针(6)---qsort函数
qsort函数是一个排序函数,它是基于快速排序的算法来排序的。qsort是一个库函数,是可以直接拿来使用的。.h。原创 2024-01-24 16:31:06 · 396 阅读 · 0 评论 -
指针(5)---回调函数
回调函数通常作为参数传递给其他函数,它是一个通过函数指针调用的函数。简单来说这个函数的作用就是用来在特殊的条件满足时用来调用其他函数的一个函数。原创 2024-01-24 14:16:26 · 344 阅读 · 0 评论 -
指针(4)---转移表
其次我们可以注意到原先向纵向延伸的一系列选择(加减乘除)变为了横向延伸,函数指针数组可以使得函数在数组内元素变化的情况下直接被使用,这也脱离了switch语句的限制。这种做法相当于使用switch语句来达到分支选项的实现,但是我们认为该代码的可读性以及长度都可以进行优化。我们可以使用一个函数指针数组(也就是一个转移表)来优化它。提高代码的可读性和维护性,也就是使得代码更加“好看”。现在要求写一个关于计算器的代码用于基本的四则运算。总而言之,操作表的使用可以大大提高程序的执行效率。原创 2024-01-23 23:31:51 · 485 阅读 · 0 评论 -
指针(3)---不同指针变量
需要注意的是,这里的两个参数名通常是可以去掉的,因为它们实际上作用不大,我们使用函数指针变量的主要目的是将这个函数存放起来。因为函数的地址就是函数名的地址,无需再使用解引用操作来调出函数的地址,它本身就已经得知了。总结:这些看似很复杂的代码,如果我们不了解函数指针的知识的话,是很难理解的。在上述代码中,通常在主函数中调用这个函数时我们会忽略这个函数的类型其实是。在使用的过程中,我们就可以使用重命名后的名字来代替原本冗长的名字,当常量字符串出现在表达式中时候,它的值也就是第一个字符的地址。原创 2023-12-19 12:31:30 · 989 阅读 · 2 评论 -
指针(2)--指针与数组
先看一个案例在这个代码中,我们提取了数组的首字母的地址和数组名来进行打印,结果是这样的:可以发现它们两个的地址是相同的,所以我们可以得出在通常情况下,数组名表示的就是数组首元素(第⼀个元素)的地址。再来看一个案例:在这个代码中,我们打印sizeof(数组名),结果是这样的:理论上来说如果数组名是数组首元素的地址,那打印出来应该是4或8也就是一个元素所占的字节,但这里却是40。原创 2023-12-11 20:36:55 · 1133 阅读 · 0 评论 -
指针(1)--对于指针基本概念的介绍
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),相当于野指针指向了一个未知门牌号的房间,一切都是未知危险的。原创 2023-12-04 17:25:06 · 979 阅读 · 0 评论 -
C语言(7)----操作符
在C语言中,struct是用来定义结构体的关键字。通过struct关键字可以定义结构体类型,并在程序中使用该类型来创建结构体变量。如图中p1与p2,直接写在函数体后和拿出来单独确立,这两种定义方式都是可行的。原创 2023-11-26 20:19:20 · 947 阅读 · 1 评论 -
C语言(6)----函数的递归思想
在斐波那契数的计算中,如果我们用while循环来代替递归,是可以很快就算出结果的,这是因为它没有经过一层又一层的剖析,而是直接通过迭代计算出结果。因为递归的思想逻辑是很简单的,那么其实也就是很死板的,它只能先递推再回归再递推再回归,那么就会出现冗长的情况。这种化简,那么可以看到经过一系列操作把没必要的项全部抵消了,其实用的也是一种递归思想,就是一步一步递推再一步一步回归,最终化繁为简。那么递归看似十分的方便,只需要用简单几行代码就可以实现一些运算,其实这也是需要付出一定的代价或者说是开销的。原创 2023-11-14 21:59:31 · 116 阅读 · 2 评论 -
C语言(5)----函数
被static修饰之后的生命周期的长度变成了跟全局变量相同的长度,也就是说它具有了和全局变量一样的生命周期性质,其实本质上是因为改变了它在存储中的位置。对于二者的区别,声明相当于函数的名称告诉你这个函数是什么,函数的定义就是这个函数的内容,但内容有时也是会包括名称的。我们可以看到局部变量是放在栈区的,而全局变量和静态变量是放在静态区的,这里的静态就是指的static的那个静态。,当需要它时才会调用它。,它是不占有内存的,对形参的修改是不会影响实参的,但在输出时输出的并不是形式参数而是实际参数。原创 2023-11-07 13:34:53 · 129 阅读 · 0 评论 -
C语言(4)----数组
C语⾔规定数组是有下标的,下标是从0开始的,也就是说当有a个元素的时候,最后一个元素的下标并不是a,而是a-1。一旦确定时就不再变化了。按照行初始化:当我们需要按照行初始化时,可以在大括号中加入小括号来表示小括号的个数代表行数,小括号中的数字代表打印的东西。数组其实就是跟集合类似的概念,它之中的东西都是同一个类型,是不会和其他数组重合的。数组有时候也是需要初始化的,初始化的值就将它放在后续的大括号中,分为完全初始化和不完全初始化。·错误的初始化:此时初始化的值大于它限制的最大值,那么这个初始化是错误的。原创 2023-10-28 17:38:17 · 118 阅读 · 1 评论 -
C语言(3)----分支和循坏以及操作符
另外,在C语言中,计数是无法直接表示出来的,但如果我们用循环语句就可以实现这个过程,也就是使我们的对象进行循环,同时设置一个新变量来进行自增,则如果循环进行一次那么新变量就自增一次,那么什么时候对象不再进行循环了,那么自增也就停止了,此时新变量的值就是计出来的数字。可以想象minecraft中的红石循环时,突然打碎一个红石,那么整个循环都会停止,但是注意,这里与其不同的是,红石循环需要打碎一个红石,相当于减少一个自我单元,但break却是加入一个词,从而达到终止的目的。直到判断为假,就会停止判断结束执行。原创 2023-10-25 14:46:27 · 129 阅读 · 1 评论 -
C语言(2)----数据类型、变量以及操作符
不同的系统中,返回值的类型有可能是 unsigned int ,也有可能是 unsigned long ,甚⾄是 unsigned long long , 对应的 printf() 占位符分别是 %u 、 %lu 和 %llu。可以把全局变量想象成共享单车,而局部变量就是自己家上锁的自行车,当全局变量和局部变量冲突的时候,即名字重复的时候,会优先识别局部变量,就好比当你家的自行车和共享单车款式相同,你当然更喜欢能上锁的自己家那一辆。需要注意这些类型都是函数,是用来表达出所要的数据的,而非数据本身。原创 2023-10-13 13:02:42 · 50 阅读 · 0 评论 -
C语言项目(1)----扫雷小游戏的实现
在游戏中,我们可以看到9*9的方格块,微笑表情,以及分数等等一些游戏设计。数字呈现的是在此方块的八个面内所有的地雷个数,这也是扫雷游戏的核心设计理念,只有知道了地雷个数才不会盲目乱猜,而是更具有逻辑性。注意,这里的界面是存放了地雷以及未存放地雷的方格块,那么我们需要设计一个二维数组来存放这些东西,才能使得游戏具有随机性和可玩性。那么这个界面显然是当我们按下1的时候就开始游戏,那么我们需要设计按下1或者0之后需要会执行的任务以及按下1游戏开始之后的界面。在这个游戏中,最棘手的部分应该是棋盘的设计。原创 2023-11-18 11:47:44 · 143 阅读 · 1 评论 -
C语言(1)----C语言是什么?基本概念介绍
控制语句:控制语句⽤于控制程序的执⾏流程,以实现程序的各种结构⽅式,相当于英语中的从句,具有很强的逻辑性(c语言支持循坏,顺序,选择三种结构,而这三种结构复合起来的代码则会有无限种可能,就相当于讲述了一个故事。也就是说不能出现/*/*注释*/*/的形式,因为当前面已经有/*时,后续识别的便是出现的第一个*/,即会出现在程序上出现多一个*/的情况,这便是由于识别的是第一个*/。main是程序的入口,同时也是唯一的开端,而return 0是结束的标志,二者相互对应,输入的代码只有在二者之中才能被编译和链接。原创 2023-10-10 23:06:34 · 43 阅读 · 1 评论