1 编辑、编译、链接
2 printf scanf用于显示器
fprintf fscanf用于文件
sprintf sscanf用于字符串
3 面试的时候必须注释,否则人家当你没有工作经验
4 全局变量有声明和定义的区别,局部变量不区分声明和定义,都是定义
5 声明可以有多个,定义只能有一个
6printf不会进行数据类型转换
7 自动转换和与强制转换,赋值的时候会自动转换,int num=3.5;int是3,+-*/会自动转换
8 常量,一旦赋值,不能修改。#define const都是常量。const只是限定代码不能直接修改。变量,可以修改。
9 标识符用于函数名称,变量名称
10 代码要注意软件工程规范
11 scanf("a=%d",&a);要输入a=10
12printf, scanf格式控制
13 C语言把所有设备当作文件处理。stdin键盘stdout显示器stderr错误stdprn打印机
14 运算符的优先级和结合性,解析复杂表达式
++自增1,*间接运算符,优先级一样,自右至左
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main()//++自增1,*间接运算符,优先级一样,自右至左 7 { 8 int a[5] = { 1,2,3,4,5 }; 9 int *p = a; 10 11 //printf("%d ", *p++);//结果1,等价于*(p++) 12 13 //printf("%d ", *++p);//结果2 14 15 printf("%d ", ++*p);//结果2 16 17 system("pause"); 18 }
15 赋值运算,嵌入式赋值,赋值会自动转换数据类型
16 逻辑与,用于某些灯泡强行关闭,某些灯泡不变。
逻辑或,用于某些灯泡强行开启,某些灯泡不变。
异或,记忆:民政局,同性0,异性1
17 while, do...while, for, 递归
18 break, continue
19 逻辑表达式,关系表达式
20 注意逻辑表达式短路效应
短路:与
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 int a = 10; 9 int b = 0; 10 printf("%d ", b && ++a); 11 printf("%d ", a); 12 13 system("pause"); 14 }
短路:或
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 int a = 10; 9 int b = 0; 10 printf("%d ", a || ++b); 11 printf("a=%d,b=%d ", a, b); 12 13 system("pause"); 14 }
21 整数的极限#include <limits.h>
22 八进制0开头
十进制
十六进制0x开头
23 整数常量的后缀
10
10u无符号型
10l长整型
24 浮点,就是浮动的小数点
long long %ll 用于处理海量数据,占8个字节
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 long long data = 1234567890; 9 printf("%lld ", data); 10 11 printf("sizeof(long long)=%d", sizeof(long long)); 12 13 system("pause"); 14 }
25 long double %lf 打印浮点数,超过8个字节就是%llf
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 printf("sizeof(long double)=%d", sizeof(long double)); 9 10 system("pause"); 11 }
26 short int等价于short,double float等价于double
27 必须掌握中文处理,宽字符,宽字符串的增删查改
28 缓冲区的概念,sizeof不是函数,而是运算符
29 return和函数参数会自动进行数据类型转换
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 int add(int a, int b)//形参自动把实参10.0转换为int类型 7 { 8 return a + b + 10.0; 9 } 10 11 main() 12 { 13 printf("%d ", add(10.0, 10)); 14 15 system("pause"); 16 }
30 强制类型转换(int)10.9
问:什么时候用到强制类型转换?
printf不会自动转换
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 double db = 10.9; 9 10 printf("%d ", (int)db);//printf不会自动转换 11 12 system("pause"); 13 }
31 数组需要理解顺序排列。指针访问,选择排序、冒泡排序、插入排序
32 指针循环数组,for(int *p=a;p<a+10;p++)
33 函数一定要有返回值,函数参数传递的顺序,从右到左
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 main() 7 { 8 int num = 10; 9 10 printf("%d,%d ", num, num++); 11 12 system("pause"); 13 }
34 数组是参数唯一没有副本机制,结构体数组、指针数组同理。数组作为参数,传递地址,数组退化为指针,指针数组退化为二级指针
35 函数改变一个外部变量,需要地址,改变一个外部指针,需要二级指针
36 3BAT必须搞定快速排序法
37 可变参数的函数,回调函数学会实现劫持
38 指针是一种数据类型,类型决定了步长、解析方式
39 *p++ ++*p指针的运算,+-,指针的运算与类型密切相关
40 指针遍历数组,二级指针遍历指针数组,指向函数指针的指针遍历指针数组
41 int a[10];实际上a是int *类型
int *a[10];实际上a是int **类型
42 int a[3][4];实际上a是int (*)[4]类型
三者区别:
&a整个数组
*a列指针
a行指针
43 理解指针与数组的区别,字符串是' '结尾
char *p="123";
p存储了地址
char str[100]="123";
str存储了字符串
p=str;//OK
44 字符串 memcpy,memset, strcat, strcmp, strcpy, strstr, puts, gets, printf, scanf, sprintf, sscanf 亲自实现
45 #define替换
#include包含
#undef 取消#define的作用范围
#if...#elif...#else...#endif
#ifdef...#endif
#ifndef...#endif
46 C语言内联函数就是#define
问:什么时候用到内联函数?
提升效率
#define X(n) n*n*n
带参数的宏定义
问:如何规避以下问题?
#define X(n) (n)*(n)*(n)
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 #define X(n) n*n*n 7 8 main() 9 { 10 printf("%d ", X(3)); 11 12 printf("%d ", X(1 + 2)); 13 14 system("pause"); 15 }
47 #标识符添加""
##链接标识符
#define要用换行
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 #define Run(M) system(M); 7 printf("%s ", M); 8 9 main() 10 { 11 Run("calc"); 12 13 system("pause"); 14 }
48 一般头文件只能存放声明,不要存放定义,避免重复包含。
如果头文件存放定义,应该加上预编译,防止重复包含。
1 #ifdef M 2 #define M 3 int add(int a, int b) 4 { 5 6 } 7 #endif
49 C的结构体不可以有方法,但是C++可以有
如何让C的结构体实现有方法?
使用函数指针
50 结构体只有初始化可以直接赋值,可以赋值另外一个结构体变量的值
->访问方式
.访问方式
1 struct info info1 = { 1,"123" }; 2 struct info info2; 3 4 info2 = { 1,"123" };//错误 5 info2 = info1;//正确
51 枚举体,共用体(主要用于嵌入式),理解位域的概念
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 struct in 7 { 8 char ch : 3;//位域,节约内存 9 char ch1 : 4; 10 }; 11 12 main() 13 { 14 printf("%d ", sizeof(struct in)); 15 16 struct in in1; 17 in1.ch = 20; 18 19 printf("%c ", in1.ch); 20 21 system("pause"); 22 }
52 calloc, malloc, realloc三大内存分配方式
53 数组优点:查询,修改
链表优点:插入,删除
二叉树可以综合以上优点
54 函数指针,可以实现回调(劫持)
55 指针数组,数组指针
56 声明四大变量auto, extern, register, static
57 const 限定不能直接赋值
58 VC只是建议,GCC就是强制,volatile会自动从内存读取,防止变量被意外修改而不知道
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <time.h> 6 7 main() 8 { 9 time_t start, end; 10 double res = 0; 11 12 time(&start);//获取时间,传递给start 13 14 for (volatile int i = 0;i < 999999999;i++) 15 { 16 res += i; 17 } 18 19 printf("%f ", res); 20 21 time(&end);//获取结束时间 22 23 printf("消耗时间%f ", difftime(end, start)); 24 25 system("pause"); 26 }