C语言知识复习回顾

1. 基础知识

1.1 计算机的数据表示

1.1.1 数值型数据

进制,二进制、八进制、十进制、十六进制

进制之间转换

1.1.2 非数值型数据

man ASCII

\0 \n ' ' 0~9 a~z A~Z

1.2 词法符号

1.2.1 关键字

32个关键字

  1. 存储类型:auto、static、extern、register

面试题:static的特点

限制作用域、延长生命周期、存放位置、初值

面试题:如何引用一个其他文件中的全局变量

  1. 数据类型:int、char、short、float、double、signed、unsigned

笔试题:计算类型的取值范围

char :有符号字符型 -128 ~ 127 -2^7 ~ 2^7-1

unsigned char:无符号字符型 0~255

int:-2^31 ~ 2^31-1

  1. 构造数据类型:struct、union、enum
  2. 控制语句:if、else、for、while、do、break、continue、return
  3. 其他:sizeof(计算数据在内存中所占的空间大小)、const(常量化)、volatile(防止编译器优化)

typedef(重定义)、void

面试题:sizeof和strlen的区别?

面试题:const的特点?

面试题:typedef和define区别?

typedef int * INT;

#define INT_T int *;

INT a, b;

INT_T c,d; //int *c, d;

1.2.2 标识符

对变量名、函数名等起名时遵循的命名规则

1)不能和关键字重复

2)由字母、数字、下划线组成

3)开头不能是数字

1.2.3 运算符

  1. 算术运算符:+、-、*、/、%、++、--

/:向下取整, int a = 5/2; //a=2 float t=5/2; //t=2.0 float t=5/2.0; //t=2.5

%:操作数只能是整数

++:

a++:先取值后自加

++a:先自加后取值

  1. 关系运算符:>、>=、<、<=、==、!=
  2. 逻辑运算符:&&、||、!

截断法则:

表达式1 && 表达式2:表达式1为假,表达式2不会进行运算

表达式1 || 表达式2:表达式1为真,表达式2不会进行运算

  1. 位运算符:&、|、^、~、<<、>>

笔试题:将一个数的某一位置1或清零,写出表达式.

  1. 赋值运算符:+=、-=、*=、=
  2. 三目运算符:

格式:表达式1?表达式2:表达式3

  1. 逗号运算符:以最后一个表达式的运行结果作为最终结果

(表达式1,表达式2,表达式3)

1.2.4 分隔符

空格、tab、回车

1.2.5 标点符号

逗号、分号、()、{}、[]

1.3 变量和常量

1.3.1 变量

面试题:全局变量和局部变量的区别

存放位置、生命周期、作用域、初值、定义位置

1.3.2 常量

  1. 字符常量:用单引号引起了的一个字符
  2. 整型常量:整数
  3. 字符串常量:用双引号引起来的一串字符
  4. 浮点常量
  5. 指数常量
  6. 标识常量:宏定义

#define 宏名 表达式

特性:原样替换

笔试题:用宏定义表示出两个数中的最小值

#define MIN(a,b) (a>b?b:a)

1.4 输入输出语句

  1. 格式输入输出:scanf/printf
  2. 字符输入输出:getchar/putchar
  3. 字符串输入输出:gets/puts

2. 控制语句

2.1. 分支语句

2.1.1. if/else语句

格式:基本格式、嵌套格式、多层格式

注意:if后面可以没有else,else前面必须得有if

if和else中间不能有间隔语句

2.1.2. switch/case语句

格式:

注意:switch后的表达式不能是字符串或浮点类型

case后可以不写break

2.2. 循环语句

2.2.1. for循环

格式:

注意:for(;;);死循环

笔试题:打印水仙花数

笔试题:打印99乘法表

笔试题:打印图案

*
**
***
****
*****

2.2.2. while循环

格式:while(表达式){循环体}

注意:表达式是循环的终止条件,循环前需要增加赋初值的表达式,循环体内需要增加自增或自减的表达式

while(1){循环体}

先判断条件,再执行循环体

2.2.3. do/while循环

格式:do{循环体}while(表达式);

注意:先执行循环体,再判断条件

2.3. 循环控制语句

2.3.1. break

结束循环

2.3.2. continue

结束本次循环,继续下一次循环

注意:用于循环语句,但是break也可以switch/case语句使用

一定要用前提条件,需要有if语句

3. 数组

概念:具有一定顺序关系的若干数据的集合

特点:数据类型相同

内存连续

3.1. 一维数组

  1. 格式:数据类型 数组名[元素个数];
  2. 特点:数组名代表数组的首地址,是地址常量
  3. 大小:数据类型大小*元素个数
  4. 注意:定义数组时元素个数可以省略

3.2. 二维数组

  1. 格式:数据类型 数组名[行数][列数];
  2. 特点:数组名代表第一行的首地址

数组名前加*,将行地址降级为列地址

  1. 大小:数据类型大小*元素个数(行*列)
  2. 注意:行数可以省略,列数不能省略

3.3. 字符数组

  1. 初始化

char 数组名[元素个数] = “字符串”

= {'a','b'.....};

= {"字符串"}

scanf("%s", 数组名);

  1. 遍历

printf("%s\n", 数组名);

3.4. 排序算法

3.4.1. 冒泡排序

思想:两两比较,满足条件进行交换,一趟比较完成后,最大值就放在了最后

3.4.2. 选择排序

思想:从数列中找最小值,找到后和第一个位置的数据进行交互,再从剩下数中找最小值,依次类推

3.5. 数组清零函数

3.5.1. bzero

3.5.2. memset

笔试题:冒泡排序

笔试题:打印斐波那契数列前15个数

笔试题:打印杨辉三角前10行

4. 指针

4.1. 一级指针

  1. 格式:数据类型 *指针名;
  2. 运算:

算术运算:+、-、++、--

两个指针相减代表的是相隔数据元素的个数

关系运算:> >= < <= == !=

赋值运算:

赋变量的地址

数组地址

指针

  1. 符号:

*

&

4.2. 二级指针

  1. 格式:数据类型 ** 指针名;
  2. 定义:存放一级指针的地址的变量

笔试题:主要是二级指针访问数据,函数传参

4.3. void和const

4.3.1. void

void *p; 任意类型的指针

强制类型转换

4.3.2. const

const int *p; //int const *p;

int *const p;

const int *const p;

面试题:说一说对指针的理解?

面试题:指针和数组的区别?

4.4. 指针数组

  1. 概念:本质是数组,数组中存放的是指针
  2. 格式:数据类型 *数组名[元素个数] = {};
  3. 大小:元素个数*指针的大小

4.5. 数组指针

  1. 概念:本质是指针,指向数组的指针
  2. 格式:数据类型 (*指针名)[个数];
  3. 大小:指针的大小

面试题:指针数组和数组指针的区别

5. 函数

5.1. 函数基础

  1. 概念
  2. 函数传参:

值传递:单向,实参值传递给形参,形参变化不会影响实参

地址传递:传递的是地址,形参变化会影响实参的值

数组传递:传递的是地址

数据类型 函数名(数据类型 数组名[(元素个数)]){}

int pipe(int fd[2]);

笔试题:实现两个数据交互的代码,分析打印结果

笔试题:void fun(int a[100]){ sizeof(a)}

5.2. string函数族

strlen、strcpy、strcat、strcmp、strncmp、strncpy

笔试题:写出strlen、strcpy、strcat源码实现

5.3. 指针函数

概念:本质是函数,返回值是指针

5.4. malloc和free

malloc:手动开辟堆区空间

free:手动释放堆区空间

char *getmem(char *p)
{
	p = malloc(100);
    strcpy(p, "hello");
    return p;
}
main()
{
	char *str = NULL;
    getmem(str);
    printf("%s\n", str);
    free(str);
}
char *getmem(char **p)
{
	*p = malloc(100);
    strcpy(*p, "hello");
    return *p;
}
main()
{
	char *str = NULL;
    getmem(&str);
    printf("%s\n", str);
    free(str);
}

面试题:说一说对函数的理解

6. 结构体/共用体/枚举

6.1. 结构体

  1. 定义格式
  2. 结构体变量
  3. 结构体数组
  4. 结构体指针
  5. 结构体大小

面试题:结构体的字节对齐原则?

6.2. 共用体

  1. 特点:

所有成员共用一块地址空间

后面的赋值会覆盖前面的赋值

  1. 大小:成员中类型最大的

面试题:什么是大小端?

面试题:如何验证大小端?

面试题:结构体和共用体的区别

6.3. 枚举

enum {}

面试题:枚举和define区别

7. 内存分配

7.1. 全局区/静态区

全局变量或静态变量

.bss:未初始化的全局变量或静态变量

.data:已初始化的全局变量或静态变量

7.2. 栈区

系统自动开辟自动释放

局部变量、函数的形参、返回值

7.3. 堆区

手动开辟手动释放

malloc开辟的空间

7.4. 常量区

常量

char *p = "hello";

*p = 'w'; //不能

char *q = "hello";

面试题:栈区和堆区的区别

面试题:什么内存泄漏?

面试题:什么是野指针?

面试题:产生段错误的原因?怎么解决段错误?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值