C语言复习

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 }
原文地址:https://www.cnblogs.com/denggelin/p/5573891.html