C语言
数据类型
变量
常量
两种方式定义常量:
- #define预处理器
- const关键字
储存类
- auto
- register
- static
- extern
运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回变量的大小。 | sizeof(a) 将返回 4,其中 a 是整数。 |
& | 返回变量的地址。 | &a; 将给出变量的实际地址。 |
* | 指向一个变量。 | *a; 将指向一个变量。 |
? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
判断
if
1
2
3
4if(boolean_expression)
{
/* 如果布尔表达式为真将执行的语句 */
}if…else
1
2
3
4
5
6
7
8if(boolean_expression)
{
/* 如果布尔表达式为真将执行的语句 */
}
else
{
/* 如果布尔表达式为假将执行的语句 */
}嵌套if
switch
1
2
3
4
5
6
7
8
9
10
11
12switch(expression){
case constant-expression :
statement(s);
break; /* 可选的 */
case constant-expression :
statement(s);
break; /* 可选的 */
/* 您可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
}嵌套switch
循环
while
1
2
3
4while(condition)
{
statement(s);
}for
1
2
3
4for ( init; condition; increment )
{
statement(s);
}
函数
- 定义
1 | return_type function_name( parameter list ) |
- 声明
- 调用
- 参数
- 传值调用
- 引用调用
作用域
- 局部变量
- 全局变量
- 形式参数
数组
声明一维数组:
type arrayName [ arraySize ];
声明多维数组:
type name[size1][size2]...[sizeN];
enum(枚举)
定义枚举类型的同时定义枚举变量:
1 | enum DAY |
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。在这个例子中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
指针
1 | type *var-name; |
eg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#include <stdio.h>
int main ()
{
int var = 20; /* 实际变量的声明 */
int *ip; /* 指针变量的声明 */
ip = &var; /* 在指针变量中存储 var 的地址 */
printf("var 变量的地址: %p\n", &var );
/* 在指针变量中存储的地址 */
printf("ip 变量存储的地址: %p\n", ip );
/* 使用指针访问值 */
printf("*ip 变量的值: %d\n", *ip );
return 0;
}
结果:
var 变量的地址: 0x7ffeeef168d8
ip 变量存储的地址: 0x7ffeeef168d8
*ip 变量的值: 20总结:
指针就是内存地址,指针变量是用来存放内存地址的变量。
使用“&”取地址,使用“*”访问地址。
字符串
字符串实际上是使用 null 字符 \0 终止的一维字符数组。
在定义时,计算数组长度要将结束符算进去。
定义方式:
- char site[6] = {‘h’ , ‘e’ , ‘l’ , ‘l’ , ‘o’ , ‘\0’};
- char site[] = “hello”;
结构体
- 结构体
1 | struct tag { |
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i 或者 float f
variable-list 是结构变量。
定义时至少出现2个;
1 | struct SIMPLE |
访问结构体成员
1 | example1.a=1; |
- 结构体指针
1 | 定义结构体指针:struct Books *struct_pointer; |
eg:
1 | #include <stdio.h> |
共用体
共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。
1 | union [union tag] |
typedef
#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于为类型定义符号名称,**#define** 不仅可以为类型定义别名,也能为数值定义别名,比如可以定义 1 为 ONE。
- typedef 是由编译器执行解释的,**#define** 语句是由预编译器进行处理的。
输入&输出
- getchar() & putchar()函数
- scanf() &printf()函数
使用前需要 #include <stdio.h>
预处理器
C 预处理器本质是一个文本替换工具
#define | 定义宏 |
---|---|
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
头文件防止重复编译:
1
2
3
4
5
6#ifndef _HEAD_H
#define _HEAD_H
...
// ... some declaration codes
...
#endif条件编译,避免使用大段注释//
1
2
3
4
5
6
7
8#if 常量表达式1
// ... some codes
#elif 常量表达式2
// ... other codes
#elif 常量表达式3
// ...
...
#endif
头文件
建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。
引用头文件的语法
引用系统头文件,在系统目录的标准列表中:
#include <file>
引用用户头文件,在包含当前文件目录下:
#include "file"
,如果在程序目录没找到就去编译器的类库路径目录下寻找该文件。
强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型。
递归
递归指的是在函数的定义中使用函数自身的方法。
语法格式如下:
1 | void recursion() |
可变参数
内存管理
命令行参数
执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是想从外部控制程序,而不是在代码内对这些值进行硬编码时。
1 | #include <stdio.h> |
argv[0] 存储程序的名称,argv[1] 是一个指向第一个命令行参数的指针,如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。
排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 归并排序
- 快速排序