
C语言
文章平均质量分 77
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。
HoRain云小助手
高性价比服务器就选HoRain Cloud,百度搜索:HoRain cloud
展开
-
C 结构体
结构体的大小可能会受到编译器的优化和对齐规则的影响,编译器可能会在结构体中插入一些额外的填充字节以对齐结构体的成员变量,以提高内存访问效率。结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c。原创 2024-09-26 10:24:14 · 917 阅读 · 0 评论 -
计算 int, float, double 和 char 字节大小
使用 sizeof 操作符计算int, float, double 和 char四种变量字节大小。sizeof 是 C 语言的一种单目操作符,如C语言的其他操作符++、--等,它并不是函数。sizeof 操作符以字节形式给出了其操作数的存储大小。原创 2024-10-16 09:43:50 · 396 阅读 · 0 评论 -
C 标准库 - <assert.h>
assert.h 标准库主要用于在程序运行时进行断言断言是一种用于测试假设的手段,通常用于调试阶段,以便在程序出现不符合预期的状态时立即发现问题。不是 的一部分。如果已在引用 的源文件中定义 NDEBUG 为宏名称,则。 提供的断言机制是 C 语言中一个有用的工具,帮助开发人员在早期发现和修复程序中的错误。的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。这实际上是一个宏,不是一个函数,可用于在 C 程序中添加诊断。原创 2024-09-30 09:37:57 · 286 阅读 · 0 评论 -
C 作用域规则
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果,因为未初始化的变量会导致一些在内存位置中已经可用的垃圾值。在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。原创 2024-09-25 09:38:47 · 391 阅读 · 0 评论 -
C 强制类型转换
例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。在这里,c 首先被转换为整数,但是由于最后的值是 float 型的,所以会应用常用的算术转换,编译器会把 i 和 c 转换为浮点型,并把它们相加得到一个浮点数。在这里,sum 的值为 116,因为编译器进行了整数提升,在执行实际加法运算时,把 'c' 的值转换为对应的 ascii 值。类型转换可以是隐式的,由编译器自动执行,也可以是显式的,通过使用。是隐式地把值强制转换为相同的类型。原创 2024-09-27 10:19:48 · 380 阅读 · 0 评论 -
C 强制类型转换
例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。在这里,c 首先被转换为整数,但是由于最后的值是 float 型的,所以会应用常用的算术转换,编译器会把 i 和 c 转换为浮点型,并把它们相加得到一个浮点数。在这里,sum 的值为 116,因为编译器进行了整数提升,在执行实际加法运算时,把 'c' 的值转换为对应的 ascii 值。类型转换可以是隐式的,由编译器自动执行,也可以是显式的,通过使用。是隐式地把值强制转换为相同的类型。原创 2024-10-08 09:54:31 · 421 阅读 · 0 评论 -
C语言的环境搭建
我们只安装 MinGW-w64 ,所以只需下载 MinGW-w64 即可,点击红框中的"SourceForge"超链接,就会进入 SourceForge 中的 MinGW-w64 下载页面。如果您使用的是 Mac OS X,最快捷的获取 GCC 的方法是从苹果的网站上下载 Xcode 开发环境,并按照安装说明进行安装。一旦安装上 Xcode,您就能使用 GNU 编译器。最常用的免费可用的编译器是 GNU 的 C/C++ 编译器,如果您使用的是 HP 或 Solaris,则可以使用各自操作系统上的编译器。原创 2024-09-20 11:22:17 · 1283 阅读 · 0 评论 -
C语言 enum(枚举)
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5。第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。原创 2024-09-24 10:10:38 · 723 阅读 · 0 评论 -
C 文件读写
如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。在这里,您的程序会在已有的文件内容中追加内容。如果写入成功,它会返回写入的字符,如果发生错误,则会返回。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。如果写入成功,它会返回一个非负值,如果发生错误,则会返回。函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型。原创 2024-09-25 11:49:56 · 688 阅读 · 0 评论 -
C 位域基础
如果您用了 32 个变量,每一个变量宽度为 1 位,那么 status 结构将使用 4 个字节,但只要您再多用一个变量,如果使用了 33 个变量,那么它将分配内存的下一段来存储第 33 个变量,这个时候就开始使用 8 个字节。这种结构需要 8 字节的内存空间,但在实际上,在每个变量中,我们只存储 0 或 1,在这种情况下,C 语言提供了一种更好的利用内存空间的方式。在这个位域定义中,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开始,占用 4 位,c 占用 4 位。原创 2024-09-26 10:43:46 · 981 阅读 · 0 评论 -
C语言的可变参数
在上面的例子中,average() 函数接受一个整数 num 和任意数量的整数参数。最后,在函数结束时使用 va_end() 宏结束可变参数列表的访问。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。被调用两次,每次第一个参数都是表示被传的可变参数的总数。省略号被用来传递可变数量的参数。有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。头文件,该文件提供了实现可变参数功能的函数和宏。,代表了要传递的可变参数的总数。原创 2024-09-20 14:46:10 · 544 阅读 · 0 评论 -
C 可变参数
在上面的例子中,average() 函数接受一个整数 num 和任意数量的整数参数。最后,在函数结束时使用 va_end() 宏结束可变参数列表的访问。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。被调用两次,每次第一个参数都是表示被传的可变参数的总数。省略号被用来传递可变数量的参数。有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。头文件,该文件提供了实现可变参数功能的函数和宏。,代表了要传递的可变参数的总数。原创 2024-09-23 11:00:09 · 435 阅读 · 0 评论 -
C 数据类型教程
函数的类型指的是函数返回值的类型。在本章节接下来的部分我们将介绍基本类型,其他几种类型会在后边几个章节中进行讲解。在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。不返回值的函数的返回类型为空。类型为 void * 的指针代表对象的地址,而不是类型。得到对象或类型的存储字节大小。它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。原创 2024-09-23 10:27:55 · 752 阅读 · 0 评论 -
C 字符串
如果 s1 和 s2 是相同的,则返回 0;如果 s1>s2 则返回大于 0。返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。字符放在字符串常量的末尾。您可以在 C 标准库中找到更多字符串相关的函数。是转义字符,意思是告诉编译器,这不是字符。在 C 语言中,字符串实际上是使用空字符。连接字符串 s2 到字符串 s1 的末尾。复制字符串 s2 到字符串 s1。结尾的一维字符数组。,所以字符数组的大小比单词。原创 2024-09-26 10:40:46 · 487 阅读 · 0 评论 -
C 内存管理
指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字符和数组等。但是,如果您预先不知道需要存储的文本长度,例如您想存储有关一个主题的详细描述。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是 0。您可以尝试一下不重新分配额外的内存,strcat() 函数会生成一个错误,因为存储 description 时可用的内存不足。当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数。原创 2024-09-27 10:32:48 · 840 阅读 · 0 评论 -
C 递归详解
从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!/* 函数调用自身 */ ... ... ... } int main() { recursion()但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。递归函数在解决许多数学问题上起了至关重要的作用,比如计算一个数的阶乘、生成斐波那契数列,等等。当上面的代码被编译和执行时,它会产生下列结果:。原创 2024-09-30 09:28:18 · 306 阅读 · 0 评论 -
C 未定义行为
未定义行为是 C 语言中一个复杂且危险的概念,它要求开发人员对 C 语言的规则有深入的理解,并采取适当的措施来避免它。当我们尝试访问数组的越界元素时,即访问数组的第0个元素之前或数组长度之后的元素时,编译器无法确定访问到的内存空间中存储的是什么内容,因此会导致未定义行为。这些都是在编程过程中需要避免的情况,因为它们可能导致程序在不同的环境下产生不确定的行为,从而使代码不可移植并可能导致程序出现错误。当执行位移操作时,位移的位数大于或等于操作数的位数时,结果是未定义的。原创 2024-10-08 09:44:30 · 771 阅读 · 0 评论 -
C 命令行参数
多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 "" 或单引号 '' 内部。让我们重新编写上面的实例,有一个空格,那么你可以通过这样的观点,把它们放在双引号或单引号""""。在 C 语言中,命令行参数是一种从命令行获取输入的方法,可以用于运行程序时传递信息给程序。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。原创 2024-09-30 09:35:48 · 409 阅读 · 0 评论 -
C 语言实例 - 输出整数
你输入的整数是: 45。输入一个整数: 45。原创 2024-10-16 09:40:06 · 317 阅读 · 0 评论 -
C 变量定义
int addtwonum() { // 函数内声明变量 x 和 y 为外部变量 extern int x;需要注意的是,局部变量(在函数内部定义的非静态变量)不会自动初始化为默认值,它们的初始值是未定义的(包含垃圾值)。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。在 C 语言中,如果变量没有显式初始化,那么它的默认值将取决于该变量的类型和其所在的作用域。原创 2024-09-24 10:05:46 · 1433 阅读 · 0 评论 -
C 斐波那契数列
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........这个数列从第3项开始,每一项都等于前两项之和。原创 2024-12-12 09:18:42 · 302 阅读 · 0 评论 -
C 安全函数
在 C 语言中,为了提高代码的安全性,尤其是防止缓冲区溢出等常见的安全问题,C11 标准引入了一些 "安全函数",也称为 "Annex K" 标准库函数。这些安全函数主要是标准字符串和内存操作函数的增强版本,通过增加参数(如缓冲区大小)来提供更好的错误检测和处理。errno_t安全函数在 Visual Studio 等编译器中得到较好的支持,但在一些较老版本的编译器中可能不可用,需要注意兼容性。原创 2024-12-12 09:14:06 · 713 阅读 · 0 评论 -
C 命令行参数
执行程序时,可以从命令行传值给 C 程序。这些值被称为,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。在 C 语言中,命令行参数是一种从命令行获取输入的方法,可以用于运行程序时传递信息给程序。命令行参数通过 main 函数的参数传递给程序。: 表示命令行参数的数量,包括程序名本身。因此,argc至少为 1。argv: 是一个指向字符串数组的指针,其中每个字符串是一个命令行参数。数组的第一个元素(即argv[0])通常是程序的名称。原创 2024-12-12 09:10:24 · 522 阅读 · 0 评论 -
C 未定义行为(Undefined behavior)
比如比较两个 NaN(非数字)值是否相等,这是未定义的行为。原创 2024-12-12 09:08:00 · 798 阅读 · 0 评论 -
C 内存管理
本章将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在头文件中找到。在 C 语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字符和数组等。C 语言提供了一些函数和运算符,使得程序员可以对内存进行操作,包括分配、释放、移动和复制等。void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。原创 2024-12-12 09:05:40 · 778 阅读 · 0 评论 -
C 可变参数
有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。其中,省略号 ... 表示可变参数列表。请注意,函数最后一个参数写成省略号,即三个点号(),省略号之前的那个参数是,代表了要传递的可变参数的总数。为了使用这个功能,您需要使用头文件,该文件提供了实现可变参数功能的函数和宏。:初始化可变参数列表。ap是一个va_list类型的变量,last_arg。原创 2024-12-11 14:38:44 · 262 阅读 · 0 评论 -
C 递归函数
递归指的是在函数的定义中使用函数自身的方法。举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"流程图:C 语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。原创 2024-12-11 14:34:58 · 314 阅读 · 0 评论 -
C 错误处理
C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。原创 2024-12-11 14:33:09 · 457 阅读 · 0 评论 -
C 强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用。原创 2024-12-11 14:31:43 · 372 阅读 · 0 评论 -
C 头文件
头文件是扩展名为的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件,需要使用 C 预处理指令来引用它。前面我们已经看过头文件,它是编译器自带的头文件。引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程序是由多个源文件组成的时候。原创 2024-12-11 14:30:01 · 861 阅读 · 0 评论 -
C 预处理器
ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。宏描述__DATE__当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。__TIME__当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。__FILE__这会包含当前文件名,一个字符串常量。__LINE__这会包含当前行号,一个十进制常量。__STDC__当编译器以 ANSI 标准编译时,则定义为 1。原创 2024-12-11 14:28:28 · 1027 阅读 · 0 评论 -
C 文件读写
tmp 一般是 Linux 系统上的临时目录,如果你在 Windows 系统上运行,则需要修改为本地环境中已存在的目录,例如: C:\tmp、D:\tmp等。如果这个函数在读取最后一个字符之前就遇到一个换行符 '\n' 或文件的末尾 EOF,则只会返回读取到的字符,包括换行符。如果写入成功,它会返回写入的字符,如果发生错误,则会返回。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型。接下来让我们来读取这个文件。原创 2024-12-11 14:25:16 · 735 阅读 · 0 评论 -
C 输入 & 输出
当我们提到时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。当我们提到时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。原创 2024-12-11 14:22:21 · 691 阅读 · 0 评论 -
C 位域详解
struct 位域结构名位域列表其中位域列表的形式为:元素描述type只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。位域的名称。width位域中位的数量。宽度必须小于或等于指定类型的位宽度。带有预定义宽度的变量被称为位域。} Age;上面的结构定义指示 C 编译器,age 变量将只使用 3 位来存储这个值,如果您试图使用超过 3 位,则无法完成。int b:2;int c:6;}data;原创 2024-12-10 09:18:19 · 1199 阅读 · 0 评论 -
C 共用体
为了定义共用体,您必须使用union语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。...union tag是可选的,每个 member definition 是标准的变量定义,比如 int i;或者 float f;或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。float f;} data;现在,Data类型的变量可以存储一个整数、一个浮点数,或者一个字符串。原创 2024-12-10 09:12:53 · 268 阅读 · 0 评论 -
C 结构体
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。...tag是结构体标签。是标准的变量定义,比如 int i;或者 float f;,或者其他有效的变量定义。结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。} book;在一般情况下,这 3 部分至少要出现 2 个。以下为实例://此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c//同时又声明了结构体变量s1//这个结构体并没有标明其标签struct。原创 2024-12-10 09:09:04 · 630 阅读 · 0 评论 -
C 字符串详解
在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。下面的声明和初始化创建了一个字符串。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词的字符数多一个。以下是 C/C++ 中定义的字符串的内存表示:其实,您不需要把 null 字符放在字符串常量的末尾。C 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。原创 2024-12-10 09:04:42 · 381 阅读 · 0 评论 -
c 函数指针
函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。原创 2024-12-10 09:01:20 · 334 阅读 · 0 评论 -
C 指针详解
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:在这里,type是指针的基类型,它必须是一个有效的 C 数据类型,var_name是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。int *ip;/* 一个整型的指针 */double *dp;/* 一个 double 型的指针 */float *fp;原创 2024-12-09 09:35:11 · 635 阅读 · 0 评论 -
C enum(枚举)
前面我们只是声明了枚举类型,接下来我们看看如何定义枚举变量。我们可以通过以下三种方式来定义枚举变量1、先定义枚举类型,再定义枚举变量enum DAY2、定义枚举类型的同时定义枚举变量enum DAY} day;3、省略枚举名称,直接定义枚举变量enum} day;原创 2024-12-09 09:29:29 · 383 阅读 · 0 评论