嵌入式面试所需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的特点

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

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

2数据类型: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

3构造数据类型:struct、union、enum

4控制语句:if、else、for、while、do、break、continue、return

5其他: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:先自加后取值

2关系运算符:>、>=、<、<=、==、!=

3逻辑运算符:&&、||、!

截断法则:

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

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

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

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

5赋值运算符:+=、-=、*=、=

6三目运算符:

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

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

(表达式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.1if/else语句

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

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

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

2.1.2switch/case语句

格式:

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

case后可以不写break

2.2循环语句

2.2.1for循环

格式:

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

笔试题:打印水仙花数

笔试题:打印99乘法表

笔试题:打印图案

2.2.2while循环

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

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

while(1){循环体}

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

2.2.3do/while循环

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

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

2.3循环控制语句

2.3.1break

结束循环

2.3.2continue

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

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

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

3数组

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

特点:数据类型相同

内存连续

3.1一维数组

1格式:数据类型 数组名[元素个数];

2特点:数组名代表数组的首地址,是地址常量

3大小:数据类型大小*元素个数

4注意:定义数组时元素个数可以省略

3.2 二维数组

1格式:数据类型 数组名[行数][列数];

2特点:数组名代表第一行的首地址

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

3大小:数据类型大小元素个数(行列)

4注意:行数可以省略,列数不能省略

3.3字符数组

1初始化

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

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

= {"字符串"}

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

2遍历

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

3.4排序算法

3.4.1冒泡排序

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

3.4.2选择排序

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

3.5数组清零函数

3.5.1bzero

3.5.2memset

笔试题:冒泡排序

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

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

4指针

4.1一级指针

1格式:数据类型 *指针名;

2运算:

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

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

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

赋值运算:

赋变量的地址

数组地址

指针

3符号:

&

4.2二级指针

1格式:数据类型 ** 指针名;

2定义:存放一级指针的地址的变量

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

4.3void和const

4.3.1void

void *p; 任意类型的指针

强制类型转换

4.3.2const

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.2string函数族

strlen、strcpy、strcat、strcmp、strncmp、strncpy

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

5.3指针函数

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

5.4malloc和free

malloc:手动开辟堆区空间

free:手动释放堆区空间

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

6结构体/共用体/枚举

6.1结构体

1定义格式

2结构体变量

3结构体数组

4结构体指针

5结构体大小

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

6.2共用体

1特点:

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

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

2大小:成员中类型最大的

面试题:什么是大小端?

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

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

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、付费专栏及课程。

余额充值