- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策语句
- C语言 - 决策语句
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 死循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值传递函数
- C语言 - 按引用传递函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - 返回语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 野指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入输出
- C语言 - 文件I/O (文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 编译指示
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言速查表
这份C语言速查表快速概述了C语言的概念,从基础到高级。这份速查表对学生、开发者和正在准备面试的人非常有用。通读这份速查表,学习C编程语言的所有基本和高级概念。
C程序的基本结构
C程序的基本结构让你了解在C语言中编写程序所需的基本语句。以下是C程序的基本结构:
// Preprocessor directive/header file inclusion section #include <stdio.h> // Global declaration section // the main() function int main() { // Variable declarations section int x, y; // other code statements section // Return o return 0; } // Other user-defined function definition section
#include <stdio.h>
#include 是一个预处理器指令,它包含C程序中的头文件。stdio.h 是一个头文件,其中定义了所有与输入输出相关的函数。
main() 函数
main() 函数是C程序的入口点,程序的执行从main() 函数开始。
以下是main() 函数的语法:
int main() { return 0; }
注释
C语言中有两种类型的注释。单行注释和多行注释。编译器会忽略注释。
单行注释
使用 // 来编写单行注释。
// This is a single-line comment
多行注释
在文本之前和之后使用 /* 和 */ 来在C语言中编写多行注释。
/* This is line 1 This is line 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 \nPercent: %f", age, percent); return 0; }
输出
Age: 18 Percent: 67.750000
数据类型
数据类型指定存储在变量中的数据的类型和大小。数据类型分为3类:
- 基本数据类型
- 派生数据类型
- 用户自定义数据类型
基本数据类型
基本数据类型是C语言中的内置数据类型,它们也用于创建派生数据类型。
数据类型 | 名称 | 描述 |
---|---|---|
int | 整数 | 表示整数值 |
char | 字符 | 表示单个字符 |
float | 浮点数 | 表示浮点值 |
派生数据类型
派生数据类型是从基本数据类型派生出来的。派生数据类型包括:
- 数组
- 指针
用户自定义数据类型
用户自定义数据类型是由程序员创建的,用于处理不同类型的数据,并根据需求而定。用户自定义数据类型包括:
- 结构体
- 联合体
- 枚举
基本的输入输出
对于C语言中的基本输入和输出,我们使用printf() 和scanf() 函数。
printf() 函数用于在控制台上打印格式化的文本。
printf("Hello world");
scanf() 函数用于从用户处获取输入。
scanf("%d", &x); // Integer input scanf("%f", &y); // float input scanf("%c", &z); // Character Input scanf("%s", name); // String input
基本输入输出示例
#include <stdio.h> int main() { int num; printf("Input any integer number: "); scanf("%d", &num); printf("The input is: %d\n", 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 | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\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) { /* statement(s) will execute if the boolean expression is true */ }
if-else语句
一个if-else语句可以后跟一个可选的else语句,当布尔表达式为假时执行。
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){ // if expr equals Value1 case Value1: Statement1; Statement2; break; // if expr equals Value2 case Value2: Statement1; Statement2; break; . . // if expr is other than the specific values above default: Statement1; Statement2; }
三元运算符
三元运算符(?:) 也称为条件运算符。它可以用作if-else语句的替代。
三元运算符的语法如下:
(condition) ? true_block: false_block;
循环
C语言循环用于分别执行一个或多个语句块指定的次数,或直到达到某个条件。以下是C语言中的循环语句:
- while循环
- do...while循环
- for循环
while循环
while循环是一种入口控制循环,其中在执行循环体之前检查条件。
while循环的语法如下:
while(test_condition){ // Statement(s); }
do…while循环
do…while循环是一种出口控制循环,其中在检查条件之前执行循环体。
do…while循环的语法如下:
do{ // Statement(s); }while(test_condition);
for循环
for循环也是一种入口控制循环,其中元素(初始化、测试条件和增量)放在一起,在for关键字的括号内形成for循环。
for循环的语法如下:
for(initialization ; test condition ; increment){ // Statement (s); }
跳转语句
跳转语句用于将程序的流程从一个地方转移到另一个地方。以下是C语言中的跳转语句:
- goto语句
- break语句
- continue语句
goto语句
goto语句将程序的控制转移到特定的标签。你需要定义一个后跟冒号(:)的标签。goto语句可以向上或向下转移程序的流程。
goto语句的语法如下:
标签名
//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> // Function declaration int add(int, int); // Function definition int add(int a, int b) { return (a + b); } int main() { int num1 = 10, num2 = 10; int res_add; // Calling the function res_add = add(num1, num2); // Printing the results printf("Addition is : %d\n", res_add); return 0; }
输出
Addition is : 20
数组
数组是相似数据类型的多个数据项的集合,它们存储在连续的内存位置。数据项可以是基本数据类型(int、float、char),也可以是用户定义的类型,例如结构体或指针可以存储在数组中。
C语言数组可以分为两种类型:
- 一维数组 - 一维数组是相同数据类型的单个数据项列表。
- 多维数组 - 多维数组,例如二维数组,是数组的数组。
数组语法
以下是不同类型数组声明的语法:
type array_name [size1]; // One-dimensional array type array_name [size1][size2]; // Two-dimensional arrays type array_name [size1][size2][size3]; // Three-dimensional arrays
一维数组示例
#include <stdio.h> int main(){ int numbers[5] = {10, 20, 30, 40, 50}; int i; // loop counter // Printing array elements 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 () { /* an array with 5 rows and 2 columns*/ int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; int i, j; /* output each array element's value */ for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 2; j++ ) { printf("a[%d][%d] = %d\n", 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 | 查找出现在字符串haystack中的整个字符串needle(不包括终止空字符)的第一次出现。 |
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 \n", book1.title); printf("Author: %s \n", book1.author); printf("Price: %lf\n", book1.price); printf("Pages: %d \n", 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 \n", data.i); printf("data.f: %f \n", data.f); return 0; }
输出
data.i: 1130135552 data.f: 220.500000
枚举 (enums)
C语言枚举 (enum)是一种枚举数据类型,它由一组整型常量组成。
枚举声明语法
enum myenum {val1, val2, val3, val4};
枚举示例
#include <stdio.h> enum status_codes { OKAY = 1, CANCEL = 0, ALERT = 2 }; int main() { // Printing values printf("OKAY = %d\n", OKAY); printf("CANCEL = %d\n", CANCEL); printf("ALERT = %d\n", 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; // Pointer declaration and initialization int * ptr = & x; // Printing the current value printf("Value of x = %d\n", * ptr); // Changing the value * ptr = 20; // Printing the updated value printf("Value of x = %d\n", * 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() Function
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]; // Opening file in write mode file = fopen("file_name.txt", "w"); if (file == NULL) { printf("Error\n"); return 1; } // Writing to the file fprintf(file, "%s", write_data); // Closing the file fclose(file); // Again, opening the file in read mode file = fopen("file_name.txt", "r"); if (file == NULL) { printf("Error.\n"); return 1; } // Reading data from the file if (fgets(read_data, 100, file) != NULL) { // Printing it on the screen printf("File's data:\n%s\n", read_data); } fclose(file); return 0; }
输出
File's data: Tutorials Point
预处理器指令
预处理器指令是预编译的一部分,以井号 (#) 字符开头。这些指令指示编译器在开始编译过程之前展开 include 并扩展代码。
以下是预处理器指令的列表:
指令 | 描述 |
---|---|
#define | 替换预处理器宏。 |
#include | 插入来自另一个文件的特定头文件。 |
#undef | 取消定义预处理器宏。 |
#ifdef | 如果定义了此宏,则返回 true。 |
#ifndef | 如果未定义此宏,则返回 true。 |
#if | 测试编译时条件是否为 true。 |
#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 | 提供与日期时间相关的函数。 |