![](https://img-blog.csdnimg.cn/direct/ad45d37189834dc2b9c7cfa60fd96872.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C语言
文章平均质量分 80
C语言相关基础知识
Stewie Lee
“古今之成大事业、大学问者,必经过三种之境界。‘昨夜西风凋碧树,独上高楼,望尽天涯路’,此第一境也。‘衣带渐宽终不悔,为伊消得人憔悴’,此第二境也。‘众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。’此第三境也。”——王国维《人间词话》
展开
-
C语言——小知识和小细节19
实现一个宏,将一个整数的二进制补码的奇数位与偶数位互换。输出格式依旧是十进制整数。原创 2024-05-26 16:42:56 · 739 阅读 · 0 评论 -
C语言——小知识和小细节18
在C语言中,atoi(ASCII to Integer)是一个标准库函数,用于将表示整数的字符串转换为其对应的整数值。该函数定义在stdlib.h头文件中。函数原型参数str:指向一个以空字符('\0')结尾的字符串,该字符串表示一个整数。参数返回转换后的整数值。如果字符串中不包含合法的整数,atoi的行为未定义,可能返回0或其他值。原创 2024-05-24 16:56:51 · 857 阅读 · 0 评论 -
C语言——预处理指令
return 0;这里是可以编译通过的,运行结果也是对的:;;return 0;这里编译器会报错:这里是有语法错误的。在C语言中,#include是一个预处理指令,用于将一个源文件的内容插入到另一个源文件中。这通常用于包含标准库或自定义库的头文件,以便在程序中使用这些库中定义的函数、类型和宏。#include或:用于包含标准库头文件。查找策略是,编译器会在标准库头文件目录中查找这些文件。:用于包含用户自定义的头文件。原创 2024-05-22 16:05:46 · 1241 阅读 · 0 评论 -
C语言——程序环境
对于前三个步骤,如果一个项目中有多个源文件,那每个源文件都会单独被编译器执行上面的三个步骤,然后产生三个对应的目标文件。然后第四步链接,则会将多个目标文件与链接库文件链接在一起。这里的链接库就是一些动态和静态库。在Visual Studio中,编译器是cl.exe,链接器是link.exe。对于前面的三个步骤,由于它们都是由编译器完成,所以可以合称为一个步骤,合称为编译,第四步由链接器完成,为单独一个步骤——链接。运行环境是程序实际执行的地方。程序必须被加载到内存中才能执行。原创 2024-05-17 11:27:07 · 929 阅读 · 0 评论 -
C语言——文件相关操作补充
对于fgetc,当返回值为EOF时,可能表示文件读取结束。对于fgets,当返回值为NULL时,可能表示文件读取结束。对于fscanf,当返回值为EOF时,可能表示文件读取结束。对于fread,当返回值小于请求的元素个数count时,可能表示文件读取结束。原创 2024-05-12 16:16:02 · 794 阅读 · 0 评论 -
C语言——文件缓冲区
用户缓冲区和系统缓冲区都是为了提高I/O操作的效率而设计的,但它们位于不同的内存空间,由不同的实体管理。用户缓冲区是用户程序的一部分,而系统缓冲区是操作系统内核的一部分。在实际的文件I/O操作中,这两种类型的缓冲区可能会同时存在,共同协作以优化性能。例如,用户程序可能首先将数据写入用户缓冲区,然后由C标准I/O库将数据从用户缓冲区转移到系统缓冲区(这里是通过调用系统接口),最终由操作系统内核将数据写入磁盘。缓冲文件系统(Buffered I/O)是标准C(ANSI C)中处理文件输入输出的一种机制。原创 2024-05-12 16:15:54 · 1417 阅读 · 0 评论 -
C语言——rand函数
这是一个在 C 标准库<stdlib.h>中定义的函数,用于生成伪随机数,默认情况下,它生成从 0 到RAND_MAX的伪随机数,其中RAND_MAX是一个常数,通常是32767。返回产生的从 0 到RAND_MAX的伪随机数。在使用 rand 函数时要配合 srand 函数设置 rand 函数的随机种子。原创 2024-05-04 23:45:19 · 1526 阅读 · 0 评论 -
C语言——文件相关操作
文件用于永久存储数据。通过使用文件,我们可以在程序关闭后保存数据,以便将来可以重新访问和修改。文件是数据存储和交换的重要手段。它们用于日志记录,数据分析,保存用户配置,程序间的数据传输等。文件是存储在某种长期存储设备上的一系列数据的集合,如硬盘、SSD、光盘或USB驱动器。计算机中的文件可以包含文本、图像、音频、视频数据或任何其他形式的信息,并且通常通过文件系统来组织和访问。在程序设计方面,我们一般讨论两种文件:程序文件和数据文件(从文件功能角度分析)。功能函数名适用于字符输入函数fgetc。原创 2024-05-04 10:21:37 · 886 阅读 · 0 评论 -
C语言——柔性数组
在结构体内部,所有成员都有固定的偏移量。如果柔性数组不是最后一个成员,那么在它之后的任何成员的位置将无法确定,因为柔性数组的大小在编译时是未知的。放在最后确保所有其他成员都有固定的偏移。原创 2024-04-29 16:42:53 · 1378 阅读 · 0 评论 -
C语言——小知识和小细节17
这段代码实际上实现不了它所想要表达的功能,而且程序会崩溃。原创 2024-04-28 16:42:36 · 669 阅读 · 1 评论 -
C语言——动态内存管理
静态分配的内存大小在编译时就固定了,不论是否使用都会占用这部分资源。动态内存管理可以根据实际需要来分配内存,这有助于避免浪费和更有效地利用有限的内存资源。许多复杂的数据结构,如树、图和各种链式结构,通常需要在运行时动态地创建和销毁节点,这也需要动态内存管理。原创 2024-04-26 19:44:04 · 949 阅读 · 0 评论 -
C语言——通讯录实现
本文只是对于结构体类型的练习。只是简单的静态通讯录实现,没有具体的UI界面,只有一些简单的功能,同时也比较粗糙,有很多地方没有经过足够的打磨。原创 2024-04-26 19:43:49 · 254 阅读 · 0 评论 -
C语言——自定义数据类型(结构体内存对齐)
使用struct...struct 结构体标签变量定义;变量定义;变量定义;...} 结构变量列表;tag是结构体标签。是标准的变量定义,比如 int i;或者 float f;,或者其他有效的变量定义。结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个结构体的自引用是一种在结构体定义中包含指向其自身类型的指针的技术。这在C语言中通常用来实现链表树和。原创 2024-04-25 09:59:27 · 984 阅读 · 0 评论 -
C语言——指针进阶
这里数组名表示首元素地址,是int*类型,将三个一维数组的首元素地址存到一个指针数组中,就可以模拟二维数组。函数指针的定义需要指定它将指向的函数的返回类型和参数类型。返回类型 (*指针变量名)(参数类型列表);实际上没有必要,只要将类型标出就行了。返回类型 (*数组名[])(参数类型列表);typedef 返回参数(*funcPtr)(参数列表);原创 2024-04-25 09:59:08 · 1440 阅读 · 0 评论 -
C语言——小知识和小细节16
例如字符串 abcd ,左旋一个就是 bcda ,左旋两个就是 cdab。原创 2024-04-23 20:41:40 · 478 阅读 · 1 评论 -
C语言——小知识和小细节14
运行结果:可以看到与数组相关的参数经过 sizeof 运算符后,得到的结果是不尽相同的。原创 2024-04-22 21:58:48 · 673 阅读 · 0 评论 -
C语言——小知识和小细节15
运行结果:所以具体的初始化情况:arr[0] 就代表二位数组第一个子数组的第一个元素的地址,所以 *p 就能访问到二位数组第一个子数组的第一个元素的地址,即为 arr[0][0] ,所以运行结果是2。原创 2024-04-22 21:58:58 · 698 阅读 · 0 评论 -
C语言——字符串和字符串函数
实际上C语言中实际上是没有内置的字符串类型的,大部分字符串都是以字符型数组和常量字符串的形式存在的。在这个例子中,greeting是一个字符数组,自动计算所需的大小以容纳字符串及其结尾的空字符\0。这里,buffer是一个大小为50的字符数组,初始化时只有前5个字符被设置为"Hello",第6个字符为空字符\0,其余字符因不完全初始化而初始化为\0。是一个指向字符的指针,指向字符串字面量的首字符。注意,字符串字面量存储在程序的只读部分,因此通过指针修改字符串内容可能会导致未定义行为。原创 2024-04-23 20:40:34 · 1349 阅读 · 0 评论 -
C语言——小知识和小细节13
一个有若干奇数和若干偶数的数组,例如。原创 2024-03-07 13:06:25 · 187 阅读 · 2 评论 -
C语言——数据存储
整型数据是以二进制补码形式在内存中存储的。原创 2024-03-07 10:00:20 · 1033 阅读 · 0 评论 -
C语言——小细节和小知识12
将句子中的单词位置倒置,标点不用倒置,例如i love you.倒置结果是:you. love i。采用两步翻转法来实现单词位置的倒置。首先,它整体翻转整个字符串,然后再逐个翻转每个单词内的字符。工作流程:函数定义:变量声明和初始化:第一个for循环:整体翻转字符串第二个for循环:翻转单词内的字符函数:运行结果:从字符串的最后读取字符串内容,用两个数组存储,将原数组从尾部读取到首部,把单词一个个填入新数组中。主要函数 进行详细分析:首先获取输入字符串 的长度,并将指针移动到字符串的末尾。原创 2024-01-17 20:12:50 · 1024 阅读 · 0 评论 -
C语言——小细节和小知识11
自幂数,也被称为阿姆斯特朗数,是一种特殊类型的数,在数学上具有一个有趣的性质:一个n位的正整数,其各个位上的数字的n次幂之和等于它本身。n: 首先,要确定一个数是几位数。例如,153是一个三位数,因此n = 3。n:接着,将该数的每个位上的数字取出来,分别计算其n次幂。对于153115125327:将上一步中得到的所有幂相加。对于153,其和是。:如果这个总和等于原来的数,则称该数为自幂数。所以,153是一个自幂数,因为。原创 2024-01-17 17:37:07 · 3512 阅读 · 0 评论 -
C语言——小细节和小知识10
在C语言中,当局部变量和全局变量的名字相同时,程序会优先使用局部变量,这是由语言的作用域规则决定的。作用域是指程序中可以访问变量的区域。局部变量局部变量是在函数或代码块内部定义的变量。它们只在定义它们的函数或代码块内部可见。当程序的执行离开该函数或代码块时,局部变量的生命周期结束,并且它们所占用的内存可能被释放或用于其他目的。全局变量全局变量是在所有函数和代码块之外定义的变量。它们在程序的整个运行期间都是可见的,并且它们的值在函数调用之间是持久的。原创 2024-01-16 16:08:35 · 994 阅读 · 0 评论 -
C语言——实用调试技巧
在C语言中,const关键字用于修饰变量,表示变量的值不应被改变。使用const类型安全: 当你将const用于函数参数时,如,这告诉编译器和阅读代码的人,这个参数指向的数据不应该被该函数修改。这提供了额外的类型安全,因为如果函数内部的代码尝试修改src指向的内容,编译器将报错。自文档化const关键字作为函数接口的一部分有助于自我文档化。人们立即可以看出src是不应该改变的,而dest因为没有const修饰,是可以被修改的。优化: 编译器可以利用const关键字进行优化。原创 2024-01-16 14:14:07 · 1380 阅读 · 0 评论 -
C语言——小细节和小知识9
如果整型数据是以小端字节序(Little-Endian)存储的,那么该数据的首地址会指向这个整型数据的最低有效字节。换句话说,整型数据的首个字节(存储在首地址处的字节)包含了这个数值的最低位部分。这意味着,如果我们有一个32位的整型数值0x123456780x0000 0x78 // 最低有效字节 (LSB)0x0003 0x12 // 最高有效字节 (MSB)在这种情况下,首地址0x0000指向的是值0x78,这是这个整型数值的最低有效字节。原创 2024-01-15 16:07:34 · 2608 阅读 · 1 评论 -
C语言——小细节和小知识8
我之前的文章《》中有详细讲解位操作符。原创 2024-01-07 10:44:23 · 1226 阅读 · 1 评论 -
C语言——结构体
int age;int height;为了声明一个匿名结构体的实例,需要先给结构体定义一个别名,或者直接在声明时提供一个变量名。如果想要声明一个匿名结构体并立即创建一个该类型的实例,可以用下列方法:struct {int age;int height;int age;int height;} Person;这是错误的。因为使用了typedef,所以在定义变量时应该直接使用别名Person,而不是。如果使用。原创 2024-01-06 10:58:20 · 1552 阅读 · 0 评论 -
C语言——指针
在C语言中,指针数组是一个数组,其每个元素都是一个指针。换句话说,指针数组是用来存储指针的数组。这种数据结构经常被用来存储字符串数组或者动态分配的结构体数组的指针。int a = 0;int b = 1;int c = 2;//指针数组存放指针。原创 2024-01-05 18:38:13 · 1615 阅读 · 0 评论 -
C语言——操作符
用于将两个数相加,例:3 + 3结果为6。原创 2024-01-02 22:00:12 · 1557 阅读 · 0 评论 -
C语言——表达式的求值
隐式类型转换,也称作自动类型转换,是编程语言在表达式求值时自动进行的类型转换,目的是解决不同类型之间的操作。而这一过程是自动发生的,不需要程序员显式指定。编译器根据一定的规则自动进行类型的转换以适应操作的需要。算术运算中:当算术运算中的操作数类型不匹配时,例如一个int类型和一个float类型相加,较低精度的类型(这里是int)会自动转换为较高精度的类型(这里是float),以便进行计算。赋值操作中:当将一个表达式的值赋给一个不同类型的变量时,如将float类型赋给int类型的变量,会进行类型转换。原创 2024-01-03 15:12:10 · 2674 阅读 · 0 评论 -
C语言——扫雷
扫雷是一款经典的小游戏,那如何使用C语言实现一个扫雷游戏呢?原创 2023-12-30 14:28:57 · 6399 阅读 · 4 评论 -
C语言——小细节和小知识7
递进这时字符串长度为0,小于2。开始回归,回归过程是之前的临时变量从前往后依次放。最终,递归完成,字符串反转完成。递进时就完成了字符串交换。回归时函数就调用结束了,回归时没有实质的语句执行。这个与上面的递归2相似,都是对应的位置交换。原创 2023-12-28 10:55:38 · 731 阅读 · 0 评论 -
C语言——数据类型
用户可以使用typedef为一个已存在的数据类型定义一个新名字。原创 2023-12-27 09:40:28 · 1553 阅读 · 0 评论 -
C语言——枚举类型
1、先定义枚举类型,再定义枚举变量enum DAY2、定义枚举类型的同时定义枚举变量enum DAY} day;3、省略枚举名称,直接定义枚举变量enum} day;这三种定义方式都是正确的。注意元素之间是用逗号分隔的。原创 2023-12-26 21:17:29 · 575 阅读 · 0 评论 -
C语言——小细节和小知识6
反斜杠,转义字符中的转义序列符将?转义,防止他被识别成三字母词(很早的东西)中的问号。原创 2023-12-23 14:42:35 · 990 阅读 · 0 评论 -
C语言——高精度除法
这里我们要实现大数除以小数,实际原理其实是模拟我们手算除法:与高精度加减乘法不同的是,高精度除法是从高位开始运算,一步一步运算到最低位的,所以不用将被除数字符串反转。原创 2023-12-22 20:53:47 · 2441 阅读 · 0 评论 -
C语言——部分操作符
逗号表达式,即是用逗号隔开的一串表达式逗号表达式的特点:从左向右依次计算,整个表达式的结果是最后一个表达式的结果[ ]下标引用操作符的操作数为数组和下标(下面实例中的图)()就是函数调用操作符。原创 2023-10-22 12:10:24 · 114 阅读 · 1 评论 -
C语言——高精度加法
我们可以把这些大数存在数组中,以防止某个数据丢失,然后通过遍历的方式将两个数组的每一位进行相加操作,然后将得到的数据进行上面(逢十进一)的操作,最终把数据存到一个新数组中。那如果数据非常大,例如10 ^ 100 + 10 ^ 100 怎么计算呢,这里就需要高精度加法了,实际上高精度加法还要用到我们小学加法中的按位相加的操作,如下图。我们知道long long int类型的数据的最大数量级大概是10 ^ 18,这个数量级已经和大了是吧,但是实际上还有更大的数,例如10 ^ 100。原创 2023-12-15 16:57:26 · 603 阅读 · 0 评论 -
C语言——小细节和小知识5
这段代码是一个简单的C程序,包含了条件编译的指令。它展示了预处理器指令 `#ifdef` 和 `#else` 的使用。在C语言中,预处理器在编译之前运行,处理这些指令。代码中定义了一个宏 MAX,它的值设置为10。在 main 函数中:1. #ifdef MAX 是预处理器指令,用于检查是否定义了宏 MAX。2. 如果 MAX 被定义了(正如代码中所做的),编译器会包含 #ifdef 和 #endif 之间的代码,程序将打印出 max。原创 2023-12-20 10:20:57 · 510 阅读 · 0 评论 -
C语言——九种控制语句
如果return后面跟的是一个函数的话,就意味着,跳出此调用函数,并且跳出后执行return后的函数,然后继续在主函数中执行程序。整型变量是4字节,数组中有10个整型数据,数组的大小应是40字节,而屏幕上打印的却是8字节,原因是在函数传参的时候,将数组变量作为参数传参时,数组变量会退化成其地址及指针变量,所以屏幕上打印的是指针变量的大小。scanf读取123456作为密码,因为中间有空格,scanf在空格处停止读取,没有读取空格,后面的getchar读取了空格,但后面还有字符,所以又出现了之前的情况。原创 2023-11-25 23:26:25 · 1509 阅读 · 0 评论