C 语言 - 速查表
这份 C 语言速查表快速概述了 C 语言概念,从基础到高级。它对学生、开发者以及准备面试的人士都非常有用。阅读这份速查表,您将学习 C 编程语言 的所有基础和高级概念。
C 程序的基本结构
C 程序的基本结构 让您了解用 C 语言编写程序所需的基本语句。以下是 C 程序的基本结构 -
// 预处理指令/头文件包含部分
#include <stdio.h>
// 全局声明部分
// main() 函数
int main() {
// 变量声明部分
int x, y;
// 其他代码语句部分
// 返回 o
return 0;
}
// 其他用户定义函数定义部分
#include <stdio.h>
#include 是一个预处理指令,用于在 C 程序中包含头文件。 stdio.h 是一个头文件,其中定义了所有与输入和输出相关的函数。
main() 函数
main() 函数是 C 程序的入口点,程序的执行从 main() 函数开始。
以下是 main() 函数的语法 -
int main() {
return 0;
}
注释
C 语言中有两种类型的注释:单行注释和多行注释。注释会被编译器忽略。
单行注释
使用 // 编写单行注释。
// 这是单行注释
多行注释
在 C 语言中,在文本前后使用 /* 和 */ 编写多行注释。
/* 这是第 1 行 这是第 2 行 .. */
打印(printf() 函数)
printf() 函数是一个库函数,用于在控制台输出上打印格式化的文本。无论何时需要打印任何内容,都可以使用 printf()。
示例
printf("Hello world");
用户输入(scanf() 函数)
scanf() 函数用于接收用户的各种类型的输入。
以下是 scanf() 函数的语法 -
scanf("format_specifier", &variable_name);
格式说明符
以下是 printf() 和 scanf() 函数中用于打印/输入特定类型值的 C 格式说明符列表。
| 格式说明符 | 类型 |
|---|---|
| %c | 字符 |
| %d | 有符号整数 |
| %e 或 %E | 科学计数法浮点数 |
| %f | 浮点值 |
| %g 或 %G | 类似于 %e 或 %E |
| %hi | 有符号整数(短整型) |
| %hu | 无符号整数(短整型) |
| %i | 无符号整数 |
| %l 或 %ld 或%li | 长整型 |
| %lf | 双精度型 |
| %Lf | 长整型 |
| %lu | 无符号整型或无符号长整型 |
| %lli 或 %lld | 长整型 |
| %llu | 无符号长整型 |
| %o | 八进制表示 |
| %p | 指针 |
| %s | 字符串 |
| %u | 无符号整数 |
| %x 或 %X | 十六进制表示 |
示例
#include <stdio.h>
int main(){
int age = 18;
float percent = 67.75;
printf("Age: %d
Percent: %f", age, percent);
return 0;
}
输出
Age: 18 Percent: 67.750000
数据类型
数据类型指定变量中存储的数据的类型和大小。数据类型分为三类:-
- 基本数据类型
- 派生数据类型
- 用户自定义数据类型
基本数据类型
基本数据类型是 C 语言的内置数据类型,也可用于创建派生数据类型。
| 数据类型 | 名称 | 描述 |
|---|---|---|
| int | 整数 | 表示整数值 |
| char | 字符 | 表示单个字符 |
| 浮点型 | 浮点型 | 表示浮点值 |
派生数据类型
派生数据类型源自基本数据类型。派生数据类型包括:-
- 数组
- 指针
用户定义数据类型
用户定义数据类型由程序员根据需求创建,用于处理不同类型的数据。用户定义数据类型包括:-
- 结构体
- 联合体
- 枚举
基本输入和输出
对于C 语言中的基本输入和输出,我们使用 printf() 和 scanf() 函数。
printf() 函数用于在控制台上打印格式化的文本。
printf("Hello world");
scanf() 函数用于接收用户的输入。
scanf("%d", &x); // 整数输入
scanf("%f", &y); // 浮点数输入
scanf("%c", &z); // 字符输入
scanf("%s", name); // 字符串输入
基本输入和输出示例
#include <stdio.h>
int main() {
int num;
printf("Input any integer number: ");
scanf("%d", &num);
printf("The input is: %d
", num);
return 0;
}
输出
Input any integer number: The input is: 0
标识符
C 标识符是用户定义的变量、常量、函数等的名称。以下是定义标识符的规则:
- 关键字不能用作标识符。
- 标识符中只能包含字母、下划线 (_) 和数字。
- 标识符必须以字母或下划线开头。
- 同一个标识符不能用作两个实体的名称。
- 标识符应该有意义且具有描述性。
有效标识符示例
age, _name, person1, roll_no
关键字
C 关键字 是 C 编译器中的反转词,用于特定目的,不得用作标识符。
以下是 C 语言中的关键字 -
| auto | double | int | struct |
| break | else | long | switch |
| case | enum | register | typedef |
| char | extern | return | union |
| continue | for | signed | void |
| do | if | static | while |
| default | goto | sizeof | volatile |
| const | float | short | unsigned |
变量
C 变量 是程序用来访问和操作数据的存储区域的名称。
声明变量的语法
data_type variable_name;
转义序列
转义序列是特殊字符后跟转义符(反斜杠 \)。转义序列具有特殊含义,用于打印那些无法正常打印的字符。
以下是 C 语言中的转义序列列表 -
| 转义序列 | 含义 |
|---|---|
| \ | \ 字符 |
| \' | ' 字符 |
| \" | " 字符 |
| \? | ?字符 |
| \a | 提醒或铃声 |
| \b | 退格键 |
| \f | 换页符 |
| 换行符 | |
| 回车符 | |
| 水平制表符 | |
| \v | 垂直制表符 |
| \ooo | 一到三位数字的八进制数 |
| \xhh . . . | 一位或多位数字的十六进制数 |
运算符
运算符是用于执行特定数学或逻辑运算的特殊符号。
以下是 C 语言中使用的运算符 -
| 运算符 | 符号 | 描述 |
|---|---|---|
| 赋值运算符 | =、+=、-=、<<= | 执行赋值运算,即将值赋给变量。 |
| 算术运算符 | +、-、*、/、% | 执行算术运算。 |
| 关系运算符 | <、>、<=、>=、==、!= | 对两个操作数进行比较。 |
| 逻辑运算符 | &&、||、! | 执行逻辑运算,例如逻辑与、或和非。 |
| 位运算符 | &、^、|、<<、>>、~ | 执行按位运算。 |
| 三元运算符 | ? : | 执行条件运算以进行决策。 |
| 其他运算符 | sizeof、&、*、⇒、. | 用于执行各种其他运算。 |
运算符示例
result = num1 + num2;
if(result >=10){
printf("Greater than 10.");
}
条件语句
C 语言提供以下条件语句 -
- if 语句
- if-else 语句
- if-else-if 语句
- 嵌套 if-else 语句
- switch 语句
- 三元运算符
if 语句
if 语句由一个布尔表达式后跟一个或多个语句组成。
if 语句的语法为 -
if(boolean_expression) {
/* 如果布尔表达式为真,则执行语句*/
}
if-else 语句
if-else 语句后面可以跟一个可选的 else 语句,该语句在布尔表达式为 false 时执行。
if 语句的语法为 −
if (Boolean expr){
Expression;
. . .
}
else{
Expression;
. . .
}
if-else-if 语句
if-else-if 语句也称为阶梯式 if-else。它用于在某个条件不成立时检查多个条件。
if-else-if 语句的语法 -
if(condition1){
}
else if(condition2){
}
else{
}
嵌套 if 语句
通过使用嵌套 if 语句,您可以在一个 if 或 else-if 语句中使用另一个 if 或 else-if 语句。
嵌套 if 语句的语法 -
if (expr1){
if (expr2){
block to be executed when
expr1 and expr2 are true
}
else{
block to be executed when
expr1 is true but expr2 is false
}
}
Switch 语句
switch 语句 允许测试变量与值列表的相等性。
switch 语句的语法为 -
switch (Expression){
// 如果 expr 等于 Value1
case Value1:
Statement1;
Statement2;
break;
// 如果 expr 等于 Value2
case Value2:
Statement1;
Statement2;
break;
.
.
// 如果 expr 与上述特定值不同
default:
Statement1;
Statement2;
}
三元运算符
三元运算符 (?:) 也称为条件运算符。它可以替代 if-else 语句。
三元运算符的语法为 -
(条件) ? true_block: false_block;
循环
C 循环 用于按指定次数执行一个或多个语句块,或直到达到特定条件。以下是 C 语言中的循环语句 -
- while 循环
- do...while 循环
- for 循环
while 循环
while 循环 是一个入口控制循环,在执行循环体之前会先检查条件。
while 循环的语法为:-
while(test_condition){
// 语句;
}
dowhile 循环
dowhile 循环是一个出口控制循环,在检查条件之前会先执行循环体。
dowhile 循环的语法为:-
do{
// 语句;
}while(test_condition);
for 循环
for 循环也是一种入口控制循环,其中元素(初始化、测试条件和增量)放在一起,用 for 关键字在括号内形成一个 for 循环。
for 循环的语法是 −
for(initialization ; test condition ; increment){
// 语句;
}
跳转语句
跳转语句用于将程序流程从一个位置转移到另一个位置。以下是 C 语言中的跳转语句 -
- goto 语句
- break 语句
- continue 语句
goto 语句
goto 语句将程序的控制权转移到特定标签。您需要定义一个标签,后跟冒号 (:)。goto 语句可以将程序流程向上或向下转移。
goto 语句的语法为 -
label_name:
//Statement(s)
if(test_condition){
goto label_name;
}
break 语句
break 语句可与循环和 switch 语句一起使用。break 语句终止循环执行,并将程序的控制权转移到循环体之外。
break 语句的语法为 -
while(condition1){
. . .
. . .
if(condition2)
break;
. . .
. . .
}
continue 语句
continue 语句用于跳过当前迭代中循环内其余语句的执行,并将其转移到下一次循环迭代。
continue 语句的语法为 -
while (expr){
. . .
. . .
if (condition)
continue;
. . .
}
用户定义函数
用户定义函数由用户定义,用于执行特定任务,从而实现代码的可重用性和模块化。
用户定义函数示例
#include <stdio.h>
// 函数声明
int add(int, int);
// 函数定义
int add(int a, int b) { return (a + b); }
int main() {
int num1 = 10, num2 = 10;
int res_add;
// 调用函数
res_add = add(num1, num2);
// 打印结果
printf("Addition is : %d
", res_add);
return 0;
}
输出
Addition is : 20
数组
数组是存储在连续内存位置的相似数据类型的数据项的集合。数据项可以是基本数据类型(int、float、char),也可以是用户定义的类型,例如结构体或指针,这些类型可以存储在数组中。
C 数组 可以分为两种类型:-
- 一维 (1D) 数组 - 一维数组是同一数据类型的数据项的单个列表。
- 多维数组 - 多维数组(例如二维数组)是数组的数组。
数组的语法
以下是不同类型数组声明的语法:-
type array_name [size1]; // 一维数组 type array_name [size1][size2]; // 二维数组 type array_name [size1][size2][size3]; // 三维数组
一维数组示例
#include <stdio.h>
int main(){
int numbers[5] = {10, 20, 30, 40, 50};
int i; // 循环计数器
// 打印数组元素
printf("The array elements are : ");
for (i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}
return 0;
}
输出
The array elements are : 10 20 30 40 50
二维数组示例
#include <stdio.h>
int main () {
/* 一个 5 行 2 列的数组 */
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
int i, j;
/* 输出每个数组元素的值 */
for ( i = 0; i < 5; i++ ) {
for ( j = 0; j < 2; j++ ) {
printf("a[%d][%d] = %d
", i,j, a[i][j] );
}
}
return 0;
}
输出
a[0][0] = 0 a[0][1] = 0 a[1][0] = 1 a[1][1] = 2 a[2][0] = 2 a[2][1] = 4 a[3][0] = 3 a[3][1] = 6 a[4][0] = 4 a[4][1] = 8
字符串
C 字符串 是一个字符序列,即一个 char 数据类型的数组,以 '\0' 表示的"空字符"结尾。要使用 scanf() 和 printf() 函数读取和打印字符串,必须使用 "%s" 格式说明符。
字符串声明
char string_name[size];
读取字符串
scanf("%s", string_name);
打印字符串
printf("%s", string_name);
C 字符串示例
#include <stdio.h>
int main() {
char name[20];
printf("Enter a name: ");
scanf("%s", name);
printf("You entered: %s", name);
return 0;
}
字符串函数
C 标准库 string.h 提供了各种处理字符串的函数。以下是 C 字符串函数列表:
| 序号 | 函数 | 描述 |
|---|---|---|
| 1 | char *strcat | 将 src 指向的字符串附加到 dest 指向的字符串的末尾。 |
| 2 | char *strncat | 将 src 指向的字符串附加到 dest 指向的字符串的末尾,最多 n 个字符。 |
| 3 | char *strchr( | 在参数 str 指向的字符串中搜索字符 c(无符号字符)的第一次出现。 |
| 4 | int strcmp | 比较 str1 指向的字符串和 str2 指向的字符串。 |
| 5 | int strncmp | 最多比较 str1 和 str2 的前 n 个字节。 |
| 6 | int strcoll | 比较字符串 str1 和 str2。结果取决于位置的 LC_COLLATE 设置。 |
| 7 | char *strcpy | 将 src 指向的字符串复制到 dest。 |
| 8 | char *strncpy | 将 src 指向的字符串最多 n 个字符复制到 dest。 |
| 9 | size_t strcspn | 计算 str1 中完全由 str2 中不存在的字符组成的初始段的长度。 |
| 10 | char *strerror | 在内部数组中搜索错误号 errnum,并返回指向错误消息字符串的指针。 |
| 11 | size_t strlen | 计算字符串 str 的长度,不包括终止空字符。 |
| 12 | char *strpbrk | 在字符串 str1 中查找第一个与 str2 中指定的任意字符匹配的字符。 |
| 13 | char *strrchr | 在参数 str 指向的字符串中搜索字符 c(无符号字符)的最后一次出现。 |
| 14 | size_t strspn | 计算 str1 中完全由 str2 中的字符组成的初始段的长度。 |
| 15 | char *strstr | 查找整个字符串 needle(不包括终止空字符)在字符串 haystack 中的第一次出现。 |
| 16 | char *strtok | 将字符串 str 拆分为一系列由 delim 分隔的标记。 |
| 17 | size_t strxfrm | 将字符串 src 的前 n 个字符转换为当前语言环境,并将它们放入字符串 dest 中。 |
结构体
C 结构体是不同数据类型的集合。结构体被视为用户定义的数据类型,您可以在其中对不同类型的数据项进行分组。
结构体声明语法
struct struct_name {
type1 item1;
type2 item2;
.
.
}structure_variable;
结构示例
#include <stdio.h>
struct book{
char title[10];
char author[20];
double price;
int pages;
};
int main(){
struct book book1 = {"Learn C", "Dennis Ritchie", 675.50, 325};
printf("Title: %s
", book1.title);
printf("Author: %s
", book1.author);
printf("Price: %lf
", book1.price);
printf("Pages: %d
", book1.pages);
printf("Size of book struct: %d", sizeof(struct book));
return 0;
}
输出
Title: Learn C Author: Dennis Ritchie Price: 675.500000 Pages: 325 Size of book struct: 48
联合
C 联合 是一种用户定义的数据类型,允许将一组不同类型的数据项存储在同一内存位置。
联合声明的语法
union [union tag]{
member definition;
member definition;
...
member definition;
} [one or more union variables];
联合示例
#include <stdio.h>
union Data{
int i;
float f;
};
int main(){
union Data data;
data.i = 10;
data.f = 220.5;
printf("data.i: %d
", data.i);
printf("data.f: %f
", data.f);
return 0;
}
输出
data.i: 1130135552 data.f: 220.500000
枚举 (enums)
C 枚举 (enum) 是一种枚举数据类型,由一组整型常量组成。
枚举声明的语法
enum myenum {val1, val2, val3, val4};
枚举 (enum) 示例
#include <stdio.h>
enum status_codes { OKAY = 1, CANCEL = 0, ALERT = 2 };
int main() {
// 打印值
printf("OKAY = %d
", OKAY);
printf("CANCEL = %d
", CANCEL);
printf("ALERT = %d
", ALERT);
return 0;
}
输出
OKAY = 1 CANCEL = 0 ALERT = 2
指针
C 指针 是一种派生数据类型,用于存储另一个变量的地址,也可用于访问和操作存储在该位置的变量数据。
指针声明的语法
data_type *pointer_name;
指针初始化的语法
如果您声明了一个指针,以下是使用另一个变量的地址初始化指针的语法 -
pointer_name = &variable_name;
指针示例
#include <stdio.h>
int main() {
int x = 10;
// 指针声明和初始化
int * ptr = & x;
// 打印当前值
printf("Value of x = %d
", * ptr);
// 更改值
* ptr = 20;
// 打印更新后的值
printf("Value of x = %d
", * ptr);
return 0;
}
输出
Value of x = 10 Value of x = 20
指针的类型
C 语言中有多种类型的指针。它们是:-
动态内存分配
变量的内存在编译时声明。 C 语言提供了一些动态内存分配函数,允许在运行时为变量分配内存。
动态内存分配函数如下:-
- malloc()
- calloc()
- realloc()
- free()
malloc() 函数
malloc() 函数分配请求的内存(指定大小的块数),并返回指向该内存的指针。
malloc() 函数的语法如下:-
malloc (size_t size); calloc() 函数
calloc() 函数
calloc() 函数分配请求的内存(指定大小的块数)并返回 void 指针。 calloc() 函数将分配的内存设置为零。
calloc() 函数的语法为 -
void *calloc(size_t nitems, size_t size)
realloc() 函数
realloc() 函数 尝试调整先前通过调用 malloc() 或 calloc() 函数分配的指针所指向的内存块的大小。
realloc() 函数的语法为 -
void *calloc(size_t nitems, size_t size)
free() 函数
free() 函数会释放先前通过 calloc()、malloc() 或 realloc() 调用分配的内存。
realloc() 函数的语法为:-
void *calloc(size_t nitems, size_t size)
文件处理
文件处理是指对文件执行各种操作,例如创建、写入、读取、删除、移动、重命名文件等。C 语言提供了各种文件处理函数。
文件操作
以下是使用 C 语言文件处理函数可以执行的文件操作 -
- 创建新文件
- 打开现有文件
- 将数据写入文件
- 将数据附加到文件
- 从文件读取数据
- 重命名文件
- 删除文件
- 关闭文件
文件处理函数
以下是 C 语言文件处理函数列表 -
| 函数 | 描述 |
|---|---|
| fopen() | 创建并以各种模式打开文件。 |
| fclose() | 关闭文件。 |
| fputc(), fputs(), fprintf() | 将数据写入文件。 |
| fgetc(), fgets(), fscanf() | 从文件读取数据。 |
| fwrite(), fread() | 向二进制文件写入数据或从二进制文件读取数据。 |
| rename() | 重命名文件。 |
| remove() | 删除文件。 |
文件处理示例
以下是 C 语言文件处理示例 -
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
char file_name[] = "my_file.txt";
char write_data[100] = "Tutorials Point";
char read_data[100];
// 以写入模式打开文件
file = fopen("file_name.txt", "w");
if (file == NULL) {
printf("Error
");
return 1;
}
// 写入文件
fprintf(file, "%s", write_data);
// 关闭文件
fclose(file);
// 再次以读取模式打开文件
file = fopen("file_name.txt", "r");
if (file == NULL) {
printf("Error.
");
return 1;
}
// 从文件读取数据
if (fgets(read_data, 100, file) != NULL) {
// 将其打印在屏幕上
printf("File's data:
%s
", read_data);
}
fclose(file);
return 0;
}
输出
File's data: Tutorials Point
预处理器指令
预处理器指令是预编译的一部分,以井号 (#) 字符开头。这些指令指示编译器在开始编译过程之前展开 include 并扩展代码。
以下是预处理器指令列表 -
| 指令 | 描述 |
|---|---|
| # Define | 替换预处理器宏。 |
| # Include | 插入来自另一个文件的特定头文件。 |
| # Undef | 取消定义预处理器宏。 |
| #ifdef | 如果此宏已定义,则返回 true。 |
| #ifndef | 如果此宏未定义,则返回 true。 |
| #if | 测试编译时条件是否为真。 |
| #else | #if 的替代方案。 |
| #elif | #else 和 #if 合二为一语句。 |
| #endif | 结束预处理器条件。 |
| #error | 在 stderr 上打印错误消息。 |
| #pragma | 使用标准化方法向编译器发出特殊命令。 |
预处理器指令示例
这是 #define 的示例,它是 C 语言中的预处理器指令之一 -
#define MAX_ARRAY_LENGTH 20
标准库
以下是常用库(C 头文件)的列表 -
| 头文件 | 用法 |
|---|---|
| stdio.h | 提供标准输入和输出函数。 |
| string.h | 提供各种字符串操作函数。 |
| math.h | 提供数学运算函数。 |
| stdlib.h | 提供各种用于内存分配、类型转换等的实用函数。 |
| time.h | 提供日期时间相关函数。 |

