C语言
C语言
杨林伟
像火箭科学家一样思考!
展开
-
32 C语言 - 命令行参数
执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行相应的动作:#includ...原创 2019-10-22 14:38:44 · 462 阅读 · 0 评论 -
31 C语言 - 内存管理
C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。注意:void *类型表示未确定类型的指针。C、C++ 规定void *类型可以通过类型转换强制转换为任何其它类型的指针。1. 动态分配内存编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,它最多容纳 100 个字符,所以您可以定义数组,如下所示:...原创 2019-10-22 14:36:40 · 363 阅读 · 0 评论 -
30 C语言 - 可变参数
有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。下面的实例演示了这种函数的定义。int func(int, ... ) { . . .} int main(){ func(2, 2, 3); func(3, 2, 3, 4);...原创 2019-10-22 14:33:28 · 284 阅读 · 0 评论 -
29 C语言 - 递归
递归指的是在函数的定义中使用函数自身的方法。举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”语法格式如下:void recursion(){ statements; ......原创 2019-10-22 14:31:46 · 510 阅读 · 0 评论 -
28 C语言 - 错误处理
C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人...原创 2019-10-22 14:29:32 · 645 阅读 · 0 评论 -
27 C语言 - 强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型。例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型,如下所示:(type_name) expression请看下面的实例,使用强制类型转换运算符把一个整数变量除以另一个整数变量,得到一个浮点数:#include ...原创 2019-10-22 14:25:55 · 475 阅读 · 0 评论 -
26 C语言 - 头文件
头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。前面我们已经看过 stdio.h 头文件,它是编译器自带的头文件。引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程...原创 2019-10-22 14:22:45 · 344 阅读 · 0 评论 -
25 C语言 - 预处理器
C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:1. 预处理器实...原创 2019-10-22 14:19:00 · 356 阅读 · 0 评论 -
24 C语言 - 文件读写
一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C 语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。1. 打开文件您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:FIL...原创 2019-10-22 14:11:39 · 321 阅读 · 0 评论 -
23 C语言 - 输入 & 输出
当我们提到输入时,这意味着要向程序填充一些数据。输入可以是以文件的形式或从命令行中进行。C 语言提供了一系列内置的函数来读取给定的输入,并根据需要填充到程序中。当我们提到输出时,这意味着要在屏幕上、打印机上或任意文件中显示一些数据。C 语言提供了一系列内置的函数来输出数据到计算机屏幕上和保存数据到文本文件或二进制文件中。1. 标准文件C 语言把所有的设备都当作文件。所以设备(比如显示器)被处...原创 2019-10-22 14:05:54 · 425 阅读 · 0 评论 -
22 C语言 - typedef
C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE:typedef unsigned char BYTE;在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如:BYTE b1, b2;按照惯例,定义时会大写字母,以便提醒用户类型名称是一个象征性的缩写,但您也可以使用小写字母,...原创 2019-10-22 13:54:21 · 325 阅读 · 0 评论 -
21 C语言 - 位域
如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下:struct{ unsigned int widthValidated; unsigned int heightValidated;} status;这种结构需要 8 字节的内存空间,但在实际上,在每个变量中,我们只存储 0 或 1。在这种情况下,C 语言提供了一种更好的利用内存空间的方式。如果您在结构内使用...原创 2019-10-22 13:42:32 · 282 阅读 · 0 评论 -
20 C语言 - 共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。1. 定义共用体为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:union [union tag]{ ...原创 2019-10-22 11:36:51 · 273 阅读 · 0 评论 -
19 C语言 - 结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:TitleAuthorSubjectBook ID1. 定义结构为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,s...原创 2019-10-22 11:33:51 · 373 阅读 · 0 评论 -
18 C语言 - 字符串
在 C 语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};依据...原创 2019-10-22 11:27:00 · 442 阅读 · 0 评论 -
17 C语言 - 函数指针与回调函数
1. 函数指针函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针变量的声明:typedef int (*fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型以下实例声明了函数指针变量 p,指向函数 max:#include <...原创 2019-10-22 11:22:46 · 464 阅读 · 0 评论 -
16 C语言 - 指针
学习 C 语言的指针既简单又有趣。通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <stdio.h> int main (){ ...原创 2019-10-22 11:16:34 · 476 阅读 · 0 评论 -
15 C语言 - enum(枚举)
枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。枚举语法定义格式为:enum 枚举名 {枚举元素1,枚举元素2,……};接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:#define MON 1#define TUE 2#define WED 3#define THU 4#define F...原创 2019-10-22 11:09:05 · 299 阅读 · 0 评论 -
14 C语言 - 数组
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。数组的声明并不是声明一个个单独的变量,比如 number0、number1、…、number99,而是声明一个数组变量,比如 numbers,然后使用 numbers[0]、numbers[1]、…、numbers[99] 来代表一个个单独的变量。数组中的特定...原创 2019-10-22 11:05:38 · 278 阅读 · 0 评论 -
13 C语言 - 作用域
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:在函数或块内部的局部变量在所有函数外部的全局变量在形式参数的函数参数定义中1. 局部变量在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。下面是使用局部变量的实例。在这里,所有的变量 a、b 和 c 是 ...原创 2019-10-22 11:01:29 · 441 阅读 · 0 评论 -
12 C语言 - 函数
函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。C 标准库提供了大量的程序可以调用的内置函数。例如...原创 2019-10-22 10:57:12 · 302 阅读 · 0 评论 -
11 C语言 - 循环
有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。编程语言提供了更为复杂执行路径的多种控制结构。循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:1. 循环类型2. 循环控制语句3. 无限循环如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无...原创 2019-10-22 10:52:27 · 366 阅读 · 0 评论 -
10 C语言 - 判断
判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的)。C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。下面是大多数编程语言中典型的判断结构的一般形式:1. 判断语句2. ? : 运算符(三元运算符)我们已经在前面的章节中讲解了 条件运算符 ? :,可以用来替代 if…else 语...原创 2019-10-22 10:49:06 · 393 阅读 · 0 评论 -
09 C语言 - 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符1. 算术运算符2. 关系运算符3.逻辑运算符4. 位运算符5. 赋值运算符6. 杂项运算符 ↦ sizeof & 三元7. 运算符优先级...原创 2019-10-22 10:46:26 · 295 阅读 · 0 评论 -
08 C语言 - 存储类
存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类:autoregisterstaticextern1.auto 存储类auto 存储类是所有局部变量默认的存储类。{ int mount; auto int month;}上面的实例定义了两个带有相同存储类的变量,auto 只能用在函...原创 2019-10-22 10:40:14 · 326 阅读 · 0 评论 -
07 C语言 - 常量
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。常量就像是常规的变量,只不过常量的值在定义后不能进行修改。1. 整数常量整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。整数常量也可以带一个后缀,...原创 2019-10-22 10:35:42 · 385 阅读 · 0 评论 -
06 C语言 - 变量
变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。基于前一章讲解的基本类型,有以下几种基本的变量类型:C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、...原创 2019-10-22 10:29:33 · 591 阅读 · 0 评论 -
05 C语言 - 数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。C 中的类型可分为以下几种:数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。1. 整数类型注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。以下列出了32位系统与64位系统的存储大小的差别(windows 相...原创 2019-10-22 10:20:09 · 454 阅读 · 0 评论 -
04 C语言 - 关键字
下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。C99 新增关键字C11 新增关键字原创 2019-10-22 10:14:26 · 358 阅读 · 0 评论 -
03 C语言 - 程序结构
C 程序主要包括以下部分:预处理器指令函数变量语句 & 表达式注释让我们看一段简单的代码,可以输出单词 “Hello World”:#include <stdio.h> int main(){ /* 我的第一个 C 程序 */ printf("Hello, World! \n"); return 0;接下来我们讲解一下上面这...原创 2019-10-22 10:09:08 · 320 阅读 · 0 评论 -
02 C语言 - 环境设置
如果想要设置 C 语言环境,需要确保电脑上有文本编辑器和 C 编译器。1. 文本编辑器这将用于输入您的程序。文本编辑器包括 Windows Notepad、OS Edit command、Brief、Epsilon、EMACS 和 vim/vi。文本编辑器的名称和版本在不同的操作系统上可能会有所不同。例如,Notepad 通常用于 Windows 操作系统上,vim/vi 可用于 Windo...原创 2019-10-22 10:06:12 · 347 阅读 · 0 评论 -
01 C语言 - 简介
C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。在 1978 年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)制作了 C 的第一个公开可用的描述,现在被称为 K&R 标准。UNIX 操作系统,C编译器,和几乎所...原创 2019-10-22 10:00:00 · 498 阅读 · 0 评论