基础 |
基本类型 |
字符 |
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声明函数 |
仅在当前文件内的函数可见 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|