C语言零基础教程
文章平均质量分 95
C语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。特点有:1.易于学习;2.结构化语言;3.它产生高效率的程序;4.它可以处理底层的活动;5.它可以在多种计算机平台上编译。
·零落·
远处的是风景,近处的才是人生。
展开
-
「C系列」C 经典练习实例
C语言经典练习实例及详细代码可以涵盖多个方面,从基础输入输出到复杂算法的实现。原创 2024-06-28 00:15:00 · 1564 阅读 · 37 评论 -
「C系列」C 排序算法
将已有序的子序列合并,得到完全有序的序列;它的工作原理是首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。快速排序是一种高效的排序算法,它采用分而治之的策略。通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。原创 2024-06-27 00:45:00 · 1274 阅读 · 5 评论 -
「C系列」C 命令行参数
C语言命令行参数为程序提供了灵活性和可配置性。通过命令行参数,用户可以轻松地指定配置选项、处理文件、传递参数值等。在编写程序时,应该充分利用命令行参数来提高程序的灵活性和可重用性。原创 2024-06-26 00:15:00 · 1640 阅读 · 8 评论 -
「C系列」C 未定义行为(Undefined behavior)
在C语言中,未定义行为(Undefined Behavior, UB)是指程序执行时的行为,在C语言标准中没有明确规定其结果的情形。当发生未定义行为时,程序的行为可能是不可预测的,可能是非法的,或者可能是符合程序员预期的(但这是一种非常危险的情况,因为不能保证在所有情况下都如此)。未定义行为可以由多种原因引起,包括但不限于:数组越界访问访问数组时超出其定义的大小。例如,对于一个只有5个元素的数组int arr[5];,尝试访问arr[5]或arr[-1]都是未定义行为。空指针解引用。原创 2024-06-25 00:30:00 · 972 阅读 · 7 评论 -
「C系列」C 内存管理
频繁地分配和释放小块内存可能会导致内存碎片化,使得虽然总内存量充足,但无法找到足够大的连续内存块来满足新的分配请求。会尝试找到一个足够大的内存块,并将原始数据复制到新的内存块中,然后返回新的内存块的指针。:如果你忘记释放分配的内存,就会导致内存泄漏。不同的是,它分配的内存会被初始化为零,并且你需要指定元素的数量和每个元素的大小,而不是总的字节数。函数用于动态分配指定字节大小的内存块,并返回一个指向该内存块的指针。释放同一块内存两次,或者释放一个已经被释放的内存块,程序可能会崩溃或产生不可预测的行为。原创 2024-06-24 00:15:00 · 1541 阅读 · 16 评论 -
「C系列」C 可变参数
然而,需要注意的是,宏只是简单的文本替换,它不会检查参数的类型或数量,因此在使用时需要特别小心。由于 C 语言在编译时并不检查可变参数的类型和数量,因此使用可变参数时要格外小心,以避免类型不匹配或越界访问等问题。C 语言中的可变参数功能主要应用场景是在那些需要处理数量不确定的参数时,比如日志记录、格式化输出、数学函数(如求和、求积等)等。在C语言中,可变参数(variadic arguments)和宏(macros)是两个不同的概念,但它们有时可以结合使用以提供更强大和灵活的功能。函数,而不需要使用宏。原创 2024-06-23 00:30:00 · 1097 阅读 · 5 评论 -
「C系列」C 递归及递归函数有哪些应用场景
在C语言中,递归是一种强大的编程技术,它允许函数直接或间接地调用自身。递归函数必须有一个或多个基本情况(base case),以便在达到某个条件时停止递归调用,否则它将无限循环下去。请注意,递归函数需要谨慎使用,因为它们可能会导致栈溢出(stack overflow)错误,特别是当递归深度非常大时。递归函数必须有一个或多个基本情况(base case),以便在达到某个条件时停止递归调用,否则它将无限循环下去。计算一个数的阶乘(factorial)是递归函数的一个经典应用。汉诺塔问题是一个经典的递归问题。原创 2024-06-22 00:15:00 · 931 阅读 · 5 评论 -
「C系列」C 错误处理
对于整数除法,当除数为零时,大多数编译器会发出警告或错误,因为这种行为在C语言标准中是未定义的(Undefined Behavior)。在C语言中,当尝试进行除法运算并且除数为零时,会触发一个运行时错误,通常被称为“被零除”或“除以零”错误。在C语言中,错误处理是一个重要的编程实践,用于确保程序在遇到错误或异常情况时能够做出适当的响应。在你的代码中,直接使用这些宏而不是硬编码具体的值是一个好习惯,因为它提高了代码的可移植性。在这个例子中,如果除数为零,程序会打印一条错误消息到标准错误流(原创 2024-06-21 00:45:00 · 1507 阅读 · 12 评论 -
「C系列」C 强制类型转换
在C语言中,当不同类型的整数参与算术运算时,会进行一系列的隐式类型转换,这些转换被称为“常用算术转换”(Usual Arithmetic Conversions)或“整数提升和转换”(Integer Promotions and Conversions)。注意:在实际编程中,应当尽量避免混合使用有符号和无符号整数进行算术运算,因为这可能导致意外的结果,尤其是当涉及到溢出和负数时。:如果两个操作数都是有符号的或都是无符号的,并且它们的类型不同,则较小类型的操作数会被转换为较大类型的操作数。原创 2024-06-20 00:15:00 · 4367 阅读 · 6 评论 -
「C系列」C 头文件及引发方法/操作
用户自定义的头文件通常存放在当前项目目录或指定的其他目录中。使用双引号可以告诉编译器在当前目录或指定的包含目录中查找这些文件。示例代码假设我们有一个用户自定义的头文件myheader.h以及一个对应的源文件myheader.c,实现了\n");然后,在main.c// main.c\n");return 0;编译和链接为了编译和链接这个程序,你需要确保所有的源文件(.c文件)和头文件(.h文件)都在同一目录或编译器的包含路径中。然后,你可以使用C编译器(如 gcc)来编译和链接这些文件。原创 2024-06-19 00:15:00 · 2536 阅读 · 8 评论 -
「C系列」C 预处理器
C语言预处理器提供了一些预定义的宏,这些宏在编译时总是可用的,而无需显式地定义它们。这些预定义宏通常用于获取关于编译器和编译环境的信息。除了上述标准的预定义宏之外,不同的编译器还可能提供自己的预定义宏。例如,GCC提供了__GNUC__等宏来表示GCC的版本信息。原创 2024-06-18 00:15:00 · 1895 阅读 · 5 评论 -
「C系列」C 文件读写
等函数向文件或标准输出(如控制台)写入数据时,这些数据首先会被写入到一个内部缓冲区中,而不是直接写入到文件或输出设备。函数)也会刷新该文件的缓冲区。函数接受一个文件指针作为参数,并将该指针指向的文件的所有未写入的数据立即写入到文件中。然而,在某些情况下,你可能希望在关闭文件之前立即看到写入的数据,这时就可以使用。在读写文件时,如果发生错误(如磁盘空间不足、文件被截断等),相关的函数(如。在文件读写操作完成后,一定要关闭文件,以释放系统资源。在C语言中,文件读写是通过一系列的标准库函数来完成的,这些函数在。原创 2024-06-17 00:30:00 · 2187 阅读 · 10 评论 -
「C系列」C 输入/输出
函数时,如果用户输入了多余的数据(比如输入了一个整数后还按下了回车,但是接下来的输入需要另一个字符),那么这些数据会被留在输入缓冲区中,导致下一次。更好的做法是使用其他方法来处理这个问题,比如读取并丢弃直到遇到换行符。因此,如果你输入了一个包含空格的字符串,读取字符串时,如果用户输入的字符串长度超过了为字符数组分配的空间,就会发生缓冲区溢出。如果你需要读取包含空格的字符串,你应该使用其他方法,如。函数来查找换行符的位置,并将其替换为字符串的结尾符(同样,格式说明符(如。来清空输入缓冲区,但需要注意的是,原创 2024-06-16 08:00:00 · 1498 阅读 · 5 评论 -
「C系列」C 位域
struct {// a占用3位// b占用5位// c占用8位(即一个字节)// d占用16位(即两个字节)原创 2024-06-16 00:45:00 · 1586 阅读 · 2 评论 -
「C系列」C 共用体
你可以使用union关键字来定义一个新的共用体类型。例如,以下代码定义了一个名为Data的共用体,它包含整型(int)、浮点型(float)和字符型(charint i;float f;char c;// ... 后续可以对共用体成员进行赋值和访问等操作return 0;原创 2024-06-16 00:15:00 · 1258 阅读 · 0 评论 -
「C系列」C 结构体
你可以使用struct关键字来定义一个新的结构体类型。例如,以下代码定义了一个名为Student的结构体,它包含学号(studentID)、姓名(name)和年龄(ageint age;首先,你需要定义结构体类型。这可以通过struct关键字来完成。// 定义一个名为Point的结构体类型,包含x和y两个整型成员int x;int y;// 定义一个名为Rectangle的结构体类型,包含两个Point类型的成员(表示左上角和右下角)原创 2024-06-15 00:45:00 · 987 阅读 · 7 评论 -
「C系列」C 字符串及操作字符串的函数
在C语言中,字符串是由字符(包括字母、数字、标点符号等)组成的序列,以空字符(null character,即)作为结尾。在C语言中,字符串不是一种基本的数据类型,但它们通常存储在字符数组(character array)中。以下是一些关于C字符串的基本概念和示例:你可以使用字符数组来存储字符串:注意,在上面的例子中,数组和会自动包含结尾的空字符。你可以像访问数组中的元素一样访问字符串中的字符:3. 字符串的长度C标准库提供了函数来计算字符串的长度(不包括结尾的空字符):4. 字符串的复制和连接C原创 2024-06-15 00:15:00 · 784 阅读 · 1 评论 -
「C系列」C 函数指针/回调函数
在这些情况下,当某个事件发生时,程序需要调用一个函数来处理该事件,但事先并不知道这个函数是什么。在 C 语言中,回调函数(Callback Function)是一种常用的编程模式,它允许一个函数作为参数传递给另一个函数,并在需要时被后者调用。通过函数指针,你可以在运行时调用不同的函数,或者将函数作为参数传递给其他函数。除了之前提到的简单示例之外,这里有一些更具体和复杂的回调函数示例,它们展示了回调函数在不同场景下的用法。在 C 语言中,函数指针的类型是由它们所指向的函数的参数和返回类型决定的。原创 2024-06-14 00:15:00 · 1084 阅读 · 7 评论 -
「C系列」C 指针及其应用案例
在C语言中,指针是一个非常重要的概念,它允许程序直接访问内存地址,并操作该地址上存储的数据。指针本身是一个变量,但它存储的不是实际的数据值,而是存储数据值的内存地址。原创 2024-06-13 07:45:00 · 1720 阅读 · 12 评论 -
「C系列」C enum(枚举)
QUIT,NEW_GAME,LOAD_GAME,HELP// 注意:这里使用了int来读取输入,因为枚举值在内存中仍然是整数case QUIT:break;break;// ... 其他选项的处理default:break;return 0;// ... 其他错误码// 假设这里有一些文件打开的逻辑if (/* 文件不存在 */) {if (/* 参数无效 */) {原创 2024-06-12 00:15:00 · 1064 阅读 · 9 评论 -
「C系列」C 数组
如果你试图访问一个不存在的数组元素(即索引超出了数组的大小),你将会得到一个未定义的行为,这可能导致程序崩溃或产生意外的结果。在C语言中,数组是一种数据结构,用于存储相同类型的元素的集合。数组的大小在创建时确定,并且在整个数组的生命周期内保持不变。C语言中的数组是静态的,意味着一旦创建,就不能改变其大小。C 数组在编程中有广泛的应用场景,包括但不限于存储固定数量的数据、实现算法(如排序、搜索等)、处理数据集合等。这些示例展示了 C 数组在不同场景中的应用,从简单的数据存储到复杂的算法实现。原创 2024-06-11 00:15:00 · 1827 阅读 · 10 评论 -
「C系列」C 作用域规则
理解这些作用域规则有助于你编写更加清晰、可维护的C语言代码。在编写代码时,应尽量避免使用全局变量,因为它们可能会导致命名冲突和数据安全问题。在C语言中,作用域(Scope)是指程序中定义的变量和函数可以被引用的区域。理解作用域规则对于编写清晰、可维护的代码至关重要。这些案例代码涵盖了C语言中不同的作用域规则,并展示了如何在代码中使用它们。请注意,在尝试访问不可见的变量时,编译器会报错。下面是一些详细的C语言作用域规则案例代码,用于说明不同作用域下的变量访问和可见性。原创 2024-06-10 00:45:00 · 1191 阅读 · 4 评论 -
「C系列」C 函数
函数定义包括函数返回类型、函数名、参数列表和函数体。:函数返回的数据类型。如果函数不返回任何值,则使用void关键字。:函数的名称,用于在程序中调用该函数。:参数列表,包括函数接受的参数类型、顺序和数量。参数列表用括号括起来,参数之间用逗号分隔。如果函数不接受任何参数,则参数列表为空(仅包含一对括号)。原创 2024-06-09 00:15:00 · 785 阅读 · 6 评论 -
「C系列」C 判断/循环
在C语言中,判断通常是通过条件语句(如,,)和逻辑运算符(如(逻辑与),(逻辑或),(逻辑非))来完成的。以下是一个简单的C语言程序示例,它使用语句进行条件判断:在这个程序中,我们定义了一个整数并给它赋值为10。然后,我们使用语句来判断的值。根据的值,程序会打印出相应的消息。你也可以使用逻辑运算符来组合多个条件。例如:在这个程序中,我们使用了逻辑与运算符来确保和都是正数。如果和都大于0,程序会打印出"a和b都是正数";否则,它会打印出"a或b不是正数"。在C语言中,循环结构用于重复执行一段代码,直到满足原创 2024-06-08 00:30:00 · 871 阅读 · 6 评论 -
「C系列」C 运算符
的值,并根据比较结果执行相应的操作(在这里是打印消息到控制台)。关系运算符的结果是一个布尔值(在C语言中,这通常是通过非零值(真)和零值(假)来表示的)。是不推荐使用的,因为它违反了C语言中的顺序点规则,可能导致不同的编译器产生不同的结果。请注意,这些示例中的二进制表示和结果可能因计算机系统和编译器的不同而略有差异,特别是当处理有符号整数时。,其最高位(符号位)被解释为数值位的一部分,所以取反后得到的是一个非常大的数。),需要注意运算的顺序和可能的副作用,因为这样的表达式可能会导致未定义的行为。原创 2024-06-07 00:15:00 · 1108 阅读 · 4 评论 -
「C系列」C 存储类
/ 静态存储类变量,作用域仅限于本文件// 调用函数// 可以在main中访问return 0;// 静态存储类变量,在函数结束时不会销毁// 更改值,并在下一次函数调用时保留// 第一次调用,输出40// 第二次调用,输出41(因为值在上一次调用后递增了)// static_var_inside 在这里不可访问,因为它是静态存储类并在函数内定义return 0;原创 2024-06-06 00:45:00 · 992 阅读 · 3 评论 -
「C系列」C 常量
虽然枚举值在逻辑上是常量,但它们在C语言中并不是真正的常量(即它们可以被赋值,但这通常是不推荐的)。虽然字符串常量本身是不可修改的,但你可以通过指针来操作字符串的副本(即,你可以创建一个字符数组,并将字符串常量复制到该数组中,然后修改该数组的内容)。对于简单的常量值(如数学常数或物理常数),并将其初始化为一个值来实现,但这种方法并不是真正的常量,因为变量仍然可以在声明它的同一文件的其他函数中被修改。修饰的变量在逻辑上是常量,但在某些情况下(例如,作为数组的大小或函数参数),它们可能不能像。原创 2024-06-05 00:15:00 · 1330 阅读 · 12 评论 -
「C系列」C 变量及常见问题梳理
在上面的例子中,我们分配了50个字符的空间,但实际上只使用了13个字符(包括null字符)。在C99及之后的版本中,可以在需要的地方声明变量,但混用这两种风格可能导致代码可读性下降。:在函数外部定义的变量(全局变量)和函数内部定义的变量(局部变量)之间可能会发生冲突,导致意料之外的结果。:在使用变量前未对其进行初始化,导致变量中存储的是不确定的值(垃圾值)。注意:在C语言中,字符串是以字符数组的形式存储的,并且以null字符(:在不同的作用域或头文件中使用了相同的变量名,导致编译错误或链接错误。原创 2024-06-04 01:00:00 · 1218 阅读 · 10 评论 -
「C系列」C 数据类型
在C语言中,数据类型定义了存储在内存中的数据的种类以及可以进行的操作。使用typedef可以为数据类型定义新名称,使得代码更易读和维护。例如,使得Integer成为int的别名。案例代码return 0;以上案例代码涵盖了C语言中常见的数据类型以及如何使用它们。注意,在不同的系统和编译器上,整数类型(如intlong等)的确切大小和范围可能会有所不同。因此,在编写可移植代码时,可能需要使用stdint.h头文件中定义的确切宽度的整数类型(如int32_tint64_t等)。原创 2024-06-03 00:15:00 · 1217 阅读 · 10 评论 -
「C系列」C 简介
C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归,具有静态类型、内存管理和低级访问等特性。它最初是由丹尼斯·里奇(Dennis M. Ritchie)在贝尔实验室(Bell Labs)为开发UNIX操作系统而设计的。C语言的设计提供了低级访问内存的能力,并且语言本身非常简洁、紧凑,这使得它成为了一个非常流行且强大的系统级编程语言。原创 2024-06-01 00:45:00 · 1097 阅读 · 9 评论