|
基础 |
| 基本类型 |
| 字符 |
char ‘A' |
| 整数 |
int 123 |
| 浮动小数点数 |
float 123.123 |
| 双倍浮点数 |
double 123.123 |
| 无 |
void |
|
| 变量类型 |
|
| 注释 |
|
| |
|
| |
|
| |
|
| |
|
|
控制语句 |
| if |
if (a > 0) {
printf("a > 0\n");
}else if (a == 0) {
printf("a = 0\n");
}else {
printf("a < 0\n");
}
|
| switch |
switch (a) {
case 1:
printf("a = 1\n");
break;
case 2:
printf("a = 2\n");
break;
case 3:
printf("a = 3\n");
break;
default:
printf("a != 1, 2, 3\n");
break;
}
|
| for |
for (i = 0; i < a; i++) {
printf("i = %d\n", i);
}
|
| |
|
| do...while |
int i = 0;
do {
printf("i = %d\n", i);
i++;
}while(i < a);
|
| |
|
| |
|
| |
|
| |
|
|
数据类型与式 |
| 数据类型修饰符 |
| long |
long int %ld
long double 也可以 %lf |
| short |
short int %hd |
| signed |
默认int, char都自带这个 |
| unsigned |
unsigned int
%u
(long .. %lu short ... %hu)
unsigned char |
| 输出时 |
float, double 都是%f |
| 输入时 |
float %f
double %lf
long double %Lf |
| |
|
| |
|
|
| 变量类型 |
| 全局变量 |
scope为程序全体 |
| 局部变量 |
scope为声明所在范围
(auto, 默认添加,故省略)
auto int sample; |
| 函数的参数是特别的局部变量 |
| |
| |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| 常数 |
具体字符或者const声明过的量
| 小数 |
普通表达 123.123
科学计数法 1.23123E2 |
| 字符常量 |
'Z'
也可以直接带数字
char test = 65 |
| 进制 |
| 十六进制 |
0x12F
数值大小写无所谓 |
| 八进制 |
07878 |
| |
|
| |
|
| |
|
|
| 末尾添加识别符 |
| float |
F
12.2F |
| long double |
L
12.2L |
| unsigned |
U
21U |
| long |
L
12L |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| 声明与定义 |
| 声明 |
int a; |
| 定义 |
a = 10;
int a = 10; 声明并定义 |
|
| 类型转换 |
| 式子里的类型转换 |
整数提升
integral promotion |
char, short变成int |
类型提升
type promotion |
变成最大的类型
long double > double >
float > unsigned long >
long > unsighed > int ... |
|
| 代入的类型转换 |
| 整数(char) -- 整数(long) |
丢失高位 |
| 整数 -- 浮点数 |
丢失小数点以下 |
|
| 类型转换 |
(type)val
例: (double)12 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
数组与字符串 |
| 数组 |
| 声明 |
| 一元数组 |
type name[size];
例: int arraytest[128]; |
| 多元数组 |
type name[size][size][size]
例: int arraytest[128][128][128] |
| |
|
| |
|
| |
|
|
| 定义 |
name[size] = {val1, val2, ....}
例: arrayTest[5] = {1, 2, 3, 4, 5};
arrayTest[2][3] = {
{1, 2, 3},
{1, 2, 3},
{1, 2, 3}
}
初始化并定义的话可以不指定长度
自动判断 |
int a[] = {1, 2, 3}
char str[] = "..." |
| |
|
| |
|
| |
|
| |
|
|
| 注意 |
C语言不自动检查索引的范围,要程序员自己注意
无法复制数组全体,要复制只能一个一个元素复制
一元字符串初始化 str[128] = "..." |
| |
|
| |
|
| |
|
|
| 字符串 |
| C语言中的字符串 |
带Null文字('0')的字符数组
以'0'结尾 |
| 读取字符串 |
gets()
| 头文件 |
stdio.h |
| 作用 |
一直接受到遇到\n为止,把换行转为'0' |
| 注意 |
不检查范围,有多少接受多少。
可能超出数组的范围 |
| |
|
| |
|
| |
|
| |
|
|
| 标准库 |
string.h |
| 基本的文字库函数 |
| 复制 |
strcpy(target, source)
把source复制到target上
注: 不检查范围 |
| 连接 |
strcat(target, source)
把source添加到target后面
注: 不检查范围 |
| 比较 |
strcmp(str1, str2)
1 》2 >0
1 = 2 = 0 完全相同返回0
1《 2 < 0 |
| 长度 |
strlen(str)
注: 最后的零字符'0'不计入 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| 转换类库函数 |
atoi("100") // 100
| 标准库 |
stdlib.h |
| atoi(str) |
str ---> int |
| atof(str) |
str ---> double |
| atol(str) |
str ---> long int |
| exit(n) |
退出程序,0为正常退出
| 和return区别 |
|
exit()在哪里都会直接结束程序
递归中也是直接退出 |
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| |
|
| |
|
|
指针 |
| 运算符 |
星号获取地址的值
(アスタリスク,asterisk) |
* |
和号获取地址
(アンパサンド,Ampersand) |
& |
| |
|
| |
|
| |
|
|
| 声明 |
type *val;
例: int *test; |
| 注意 |
| 指针和指针所指对象要相同数据类型 |
|
| 指针在初始化(指向某处)之前不能用 |
|
| 零指针(NULL)试做无效指针,不指向任何地方 |
|
| 不带索引的数组表示数组开头的地址 |
int a[128];
a = &b; |
int testA[128], testB[128];
for(i = 0; i < sizeof(testB)/sizeof(int); i++) {
testB[i] = i;
}
*testA = *testB;
for(i = 0; i < sizeof(testA)/sizeof(int); i++) { //给testB赋值
printf("testA[%d] = %d ", i, testA[i]);
printf("testB[%d] = %d\n", i, testB[i]);
}//说明不可以直接把数组复制
int *p;
p = testB; //p指向testB的开头
i = 0;
while (i < sizeof(testB)/sizeof(int)) {//指针遍历数组
printf("testB[%d] = %d\n", i, *(p++));
//p++;
i++;
}
|
|
指针运算是实际值
+1是前进1个数据大小的地址 |
|
| |
|
| |
|
| |
|
| |
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
函数与递归 |
| 函数原型 |
void test();
放在开头
也就是函数的声明,定义放在其他地方 |
| 长度不定的函数 |
int test(int a, ...); |
| |
|
| |
|
| |
|
| |
&nbr> |
| |
|
|
输入输出I/O |
| EOF |
-1 |
| 宏替换 |
#define SAMPLE 0 |
输入输出1
(字符) |
| 头文件: stdio.h |
|
输入 |
| int getchar(void) |
直接带入char
高位直接舍弃(高位本来就没用) |
失败返回EOF,也就是-1
文件输入输出时候重定向也可能出错 |
不用检验,失败了基本是硬件问题 |
| |
|
| |
|
|
输出 |
| int putchar(int ch) |
|
| 失败返回EOF,也就是-1 |
不用检验,失败了基本是硬件问题 |
| |
|
| |
|
|
输入输出2
(字符串) |
| 头文件: stdio.h |
|
输入 |
| char *gets(char *str) |
读到改行 |
| 返回值 |
|
| |
|
| |
|
|
输出 |
| int puts(char *str) |
输出str并附加\n |
| 返回值 |
|
| |
|
| |
|
|
| printf |
| 指定 |
%[+/-][[0]最小幅度][.][精度]格式修饰符 |
| %c |
字符 |
%d
%i |
带符号的10进制整数 |
%e
%E |
小数的科学计数法
1.234e10
1.234E10 |
| %f |
10进制小数
double, float |
%g
%G |
%f和%e中小的那个
%f和%E中小的那个 |
| %o |
不带符号的8进制数 |
| %s |
字符串 |
| %u |
不带符号的10进制数 |
%x
%X |
不带符号的16进制数
小写
不带符号的16进制数 大写 |
| %p |
指针
注:用其他格式指定的话,高位会被舍弃(已测试) |
| %n |
??? |
| %% |
%符号 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| scanf |
主要用来读取数字
| %c |
字符 |
%d
%i |
10进制整数
两个一样
short 带h
long 带l |
%e
%f
%g |
小数
三个一样
默认float
double用l
long double 用L |
| %o |
8进制整数
short 带h
long 带l |
| %x |
16进制整数
short 带h
long 带l |
| %s |
字符串
不推荐
遇到空白(空格,tab,换行)会自动结束 |
| %p |
指针 |
| %n |
??? |
| %u |
不带符号的10进制整数
short 带h
long 带l |
| %[] |
字符集合
一直读到集合里没有的
| 指定范围, 可用 - |
| [AB], [ABC], [01A] |
| [A-Z] |
| [A-Za-z] |
| [0-9] |
想指定"-"必须放开头或者结尾
[-...]
[...-] |
| [^...]
除去指定的 |
| |
| |
| |
|
| %*c |
忽视一个字符
%*格式修饰符
忽略这个 |
空格
任意字符 |
忽略所以空格直到出现一个非空格的
如"%d %d"读取 1
2
和他一直的以外的全部丢掉 |
| 可以指定长度 |
除了%c 和%n
如 s ] |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
文件输入输出 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
构造体与共用体 |
| 声明构造体 |
struct tag {
member1;
member2; ...
};
加强版 typedef struct tag Tag;
例
struct test {
int a;
int b;
};
typedef struct test Test;
或
typedef enum { false, true } bool;
|
| 声明变量 |
struct tag val-name;
Tag val-name;
例
Test test1 ;
|
| 初始化 |
| 单个 |
Test test1 = {
.a =
1,
.b =
2
};
|
| 结构体的数组 |
Test test[2] =
{
{.a =
1, .b =
2},
{.a =
3, .b =
4}
};
|
|
| 获取成员 |
| 点运算符 |
val-name.mem-name
例: test1.a |
| |
|
| 箭头运算符 |
val-name->mem-name
例: test2 =
&test1;
test2->.a |
| |
|
| |
|
|
| 计算大小 |
sizeof (struct tag)
sizeof(Tag) |
| 结构体的嵌套 |
结构体的成员可以是结构体 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
复杂的数据类型与运算符 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| 预处理以及其他高度的话题 |
| 动态分配内存 |
|
库文件: stdlib.h |
|
分配 |
void *malloc(size_t numbytes);
分配区别没有初始化 |
返回分配的内存的开头指针
失败的话返回NULL
要检验是否失败 |
void *calloc(size_t nmemb, size_t
size);
区别:nmemb指定分配大小的个数,并且所有区域以0初始化 |
要类型转换 |
| |
|
| |
|
|
释放 |
| void free(void *ptr); |
|
| |
|
| |
|
| |
|
|
| static声明函数 |
仅在当前文件内的函数可见 |
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|