目录
[1. C语言部分](#1. C语言部分)
[1.1. 关键字static有什么用途?](#1.1. 关键字static有什么用途?)
[1.2. 如何引用一个已经定义过的全局变量?](#1.2. 如何引用一个已经定义过的全局变量?)
[1.3. 设有以下说明和定义:](#1.3. 设有以下说明和定义:)
[1.4. 写出float x 与"零值"比较的if语句](#1.4. 写出float x 与“零值”比较的if语句)
[1.5. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?](#1.5. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?)
[1.6. 什么是平衡二叉树?](#1.6. 什么是平衡二叉树?)
[1.7. 堆栈溢出一般是由什么原因导致的?](#1.7. 堆栈溢出一般是由什么原因导致的?)
[1.8. 冒泡排序算法的时间复杂度是什么?](#1.8. 冒泡排序算法的时间复杂度是什么?)
[1.9. 什么是字节对齐,为什么要对齐?如果不对齐产生什么后果?](#1.9. 什么是字节对齐,为什么要对齐?如果不对齐产生什么后果?)
[1.10. char str[20]="0123456789"; sizeof与strlen的结果分别是?](#1.10. char str[20]="0123456789"; sizeof与strlen的结果分别是?)
[1.11. 解释栈、堆、静态存储区](#1.11. 解释栈、堆、静态存储区)
[1.12. 解释野指针](#1.12. 解释野指针)
[1.13. 解释大小端](#1.13. 解释大小端)
[2. C++部分](#2. C++部分)
[2.1. 引用有什么特点?与指针的异同?](#2.1. 引用有什么特点?与指针的异同?)
[2.2. 什么是函数重载?哪些运算符不能重载?](#2.2. 什么是函数重载?哪些运算符不能重载?)
[2.3. New delete malloc free 的区别?](#2.3. New delete malloc free 的区别?)
[2.4. 解释一下左值 右值](#2.4. 解释一下左值 右值)
[2.5. 虚函数的区别](#2.5. 虚函数的区别)
[2.6. C和C++中的强制类型转换](#2.6. C和C++中的强制类型转换)
[2.7. 解释一下智能指针](#2.7. 解释一下智能指针)
[2.8. 简述下c++的模板](#2.8. 简述下c++的模板)
[2.9. Vector 的定义,初始化,添加,扩容,删除,插入,迭代](#2.9. Vector 的定义,初始化,添加,扩容,删除,插入,迭代)
[3. 网络部分](#3. 网络部分)
[3.1. Internet采用哪种网络协议?该协议的主要层次结构?](#3.1. Internet采用哪种网络协议?该协议的主要层次结构?)
[3.2. Internet物理地址和IP地址转换采用什么协议?](#3.2. Internet物理地址和IP地址转换采用什么协议?)
[3.3. 简述交换机路由器的工作原理](#3.3. 简述交换机路由器的工作原理)
[3.4. IP地址的编码分为哪俩部分?](#3.4. IP地址的编码分为哪俩部分?)
[3.5. 什么是VLAN?](#3.5. 什么是VLAN?)
[3.6. TCP/IP通信建立的过程怎样,端口有什么作用?](#3.6. TCP/IP通信建立的过程怎样,端口有什么作用?)
[4. Linux部分](#4. Linux部分)
[4.1. Linux内核引导时,从文件哪个配置文件中读取要加载的文件系统?](#4.1. Linux内核引导时,从文件哪个配置文件中读取要加载的文件系统?)
[4.2. Linux链接分为哪两种?](#4.2. Linux链接分为哪两种?)
[4.3. 某文件的权限为:drw-r--r--,用数值形式表示该权限](#4.3. 某文件的权限为:drw-r--r--,用数值形式表示该权限)
[4.4. 在用vi编辑文件时, 如何保存修改?](#4.4. 在用vi编辑文件时, 如何保存修改?)
[4.5. 常见代码版本管理程序?](#4.5. 常见代码版本管理程序?)
[4.6. 简述linux iptables的作用?](#4.6. 简述linux iptables的作用?)
[4.7. linux上定时任务使用什么配置?](#4.7. linux上定时任务使用什么配置?)
[4.8. 常见的linux文本操作命令?](#4.8. 常见的linux文本操作命令?)
[4.9. 常见linux网络配置命令](#4.9. 常见linux网络配置命令)
[5. 单片机部分](#5. 单片机部分)
[5.1. 单片机I/O口有什么作用?I/0口的驱动能力?上拉电阻与下拉电阻的作用?](#5.1. 单片机I/O口有什么作用?I/0口的驱动能力?上拉电阻与下拉电阻的作用?)
[5.2. 单片机常见的寻址方式](#5.2. 单片机常见的寻址方式)
[5.3. 看门狗的原理?](#5.3. 看门狗的原理?)
[5.4. 复位时单片机有什么动作?](#5.4. 复位时单片机有什么动作?)
[5.5. 中断的响应过程?](#5.5. 中断的响应过程?)
[5.6. 中断嵌套的好处与坏处?](#5.6. 中断嵌套的好处与坏处?)
[5.7. 什么是可重入型函数,使用时需要注意哪些问题?](#5.7. 什么是可重入型函数,使用时需要注意哪些问题?)
[5.8. 单片机常用接口总线?](#5.8. 单片机常用接口总线?)
[5.9. Cortex-M3的提供的流水线是几级?](#5.9. Cortex-M3的提供的流水线是几级?)
[5.10. 什么是PWM](#5.10. 什么是PWM)
[5.11. 简述DMA控制器](#5.11. 简述DMA控制器)
1. C语言部分
1.1. 关键字static有什么用途?
三个作用:
static修改的变量只分配一次空间
static修饰的变量只能在当前源文件使用
static修饰的函数只能在当前源文件使用
1.2. 如何引用一个已经定义过的全局变量?
使用extern关键字进行引用
1.3. 设有以下说明和定义:
typedef union {long i; int k[5]; char c;} DATE;struct data { int cat; DATE cow; double dog;} too;DATE max;则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:
答案:52
1.4. 写出float x 与"零值"比较的if语句
if (x > -0.000001 && x < 0.000001)if (x > -0.000001 && x < 0.000001)
1.5. 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c语言使用define宏定义
c++使用inline内联函数
1.6. 什么是平衡二叉树?
1.平衡二叉树任意节点的左子树和右子树的高度差最多为1
2.所有节点的左子树和右子树都是平衡二叉树
3.在最坏的情况下,查找、插入和删除操作具有较好的时间复杂度
1.7. 堆栈溢出一般是由什么原因导致的?
1.递归调用:每次调用都会将函数的返回地址和局部变量信息存储在栈中,调用层次过多栈就会被耗尽
2.局部变量过大,占用过多栈空间
3.递归调用或者循环调用缺少终止条件
1.8. 冒泡排序算法的时间复杂度是什么?
答案:0(n^2)
1.9. 什么是字节对齐,为什么要对齐?如果不对齐产生什么后果?
什么是字节对齐:
1.数据结构的起始地址必须是某个特定数值的倍数。
2.对齐大小由计算机硬件架构和编译器决定
对齐目的:
1.提高访问速度
2.减少内存碎片
3.兼容不同硬件平台
不进行字节对齐后果:
1.内存访问错误
2.性能下降
3.内存浪费
1.10. char str[20]="0123456789"; sizeof与strlen的结果分别是?
sizeof:20
strlen:10
1.11. 解释栈、堆、静态存储区
stack栈区:
1.自动分配,自动释放内存的空间
2.存储的局部变量
3.栈是先入先出的数据结构
4.栈的大小有限制
heap堆区:
1.程序员手动申请,手动释放
2.堆区的空间是不连续的,一般空间比栈大
3.c++用new,c用malloc
static静态存储区:
1.存储全局变量和静态变量
2.在程序启动时分配,结束时释放
3.变量的声明周期贯穿整个程序
1.12. 解释野指针
野指针定义:
指向已释放或无效内存地址的指针
常见产生原因:
1.释放后未置为NULL
2.指针超出了作用域
3.指针访问了已释放的内存
1.13. 解释大小端
- 大端字节序(Big-Endian):
- 在大端字节序中,多字节数据的高位字节(最高有效字节)被存储在低地址处,而低位字节(最低有效字节)被存储在高地址处。
- 以16位整数为例,如果数值为0x1234,那么高位字节0x12将被存储在低地址处,低位字节0x34将被存储在高地址处。
- 小端字节序(Little-Endian):
- 在小端字节序中,多字节数据的高位字节(最高有效字节)被存储在高地址处,而低位字节(最低有效字节)被存储在低地址处。
- 以16位整数为例,如果数值为0x1234,那么高位字节0x12将被存储在高地址处,低位字节0x34将被存储在低地址处。
2. C++部分
2.1. 引用有什么特点?与指针的异同?
引用:
- 别名机制
- 与原变量共享内存
- 不占用额外空间
同指针的异同:
相同点:
- 都提供了对变量的间接访问的能力
- 都可以传递变量的地址作为函数的参数
不同点:
指针使用*,引用使用&
指针可以为NULL,引用不能为NULL
指针可不初始化,引用必须进行初始化
指针可以指向别的指针,引用不能成为别的引用,引用具有唯一性
2.2. 什么是函数重载?哪些运算符不能重载?
函数重载:
同一作用域下,可以定义多个同名函数,其参数列表必须不相同,参数的类型,个数或顺序不同
(函数的返回值不会影响函数的重载)
不能重载的运算符:
. 成员访问运算符
* 成员指针访问运算符
:: 域运算符
?: 三元条件运算符
sizeof 类型长度运算符
typeid 类型信息运算符
2.3. New delete malloc free 的区别?
类型安全性:
new和delete:在分配和释放时会调用构造和析构,确保被正确销毁。
malloc和free:不会调用构造和析构,需要手动管理内存
内存大小:
new和delete:自动计算所需的内存大小
malloc:手动指定
返回类型:
new:返回分配对象的指针
malloc:返回void*,需要进行类型转换
异常处理:
new:无法分配所需的内存,抛出std::bad_alloc异常
malloc:分配失败返回NULL
用途:
new和delete:用于c++对象的动态分配和释放
malloc和free:用于分配和释放任意类型的内存块
2.4. 解释一下左值 右值
左值:持久占有内存位置的表达式
右值:不持久占有内存位置的表达式
2.5. 虚函数的区别
虚函数:
在基类中声明,用关键词virtual进行修饰
虚函数在派生类中被重写(覆盖)
虚函数允许在运行时根据对象的实际类型来确定调用那个函数
基类中的虚函数需要提供一个默认的实现
纯虚函数:
在基类中声明,没有函数体,用"=0"
进行声明
纯虚函数没有默认实现,派生类必须提供自己的实现
当类中存在虚函数,他就被称为抽象类,不能实例化对象
派生类必须实现基类中的所有纯虚函数才能成为具体类
2.6. C和C++中的强制类型转换
C风格:
C风格的强转使用括号进行表示
C++风格:
提供了四种类型转换:
static_cast<type>(expression)
:基本类型的转换
dynamic_cast<type>(expression)
:基类和派生类之间的转换
reinterpret_cast<type>(expression)
:指针之间的转换
const_cast<type>(expression)
:去除表达式中的const和volatile
2.7. 解释一下智能指针
智能指针作用:
用于管理动态分配的内存资源,避免内存泄漏和悬挂指针。
在C++中,智能指针可以通过使用特殊的模板类来实现。
1shared_ptr
:共享指针,允许多个指针共享同一块内存资源,通过引用计数来管理内存的释放。
2.unique_ptr
:独占指针,禁止多个指针共享同一块内存资源,它使用移动语义来实现所有权的转移。
3.weak_ptr
:用于解决shared_ptr
的循环引用问题,允许访问shared_ptr
所管理的内存资源,不会增加引用计数。
2.8. 简述下c++的模板
模板作用:模板提供了强大的泛型编程能力,可以帮助开发人员编写通用的代码。
1.函数模板:函数模板允许定义通用的函数,可以在多种数据类型下使用
template <typename T>
T add(T a, T b) {
return a + b;
}
-
类模板:类模板允许定义通用的类,可以用于多种数据类型
template <typename T>
class MyVector {
// 类定义和成员函数
// ...
};
3.模板特化:模板特化允许为特定类型或特定条件提供专门的实现。
// 完全特化
template <>
class MyVector<int> {
// 针对int类型的特定实现
// ...
};
// 部分特化
template <typename T>
class MyVector<T*> {
// 针对指针类型的特定实现
// ...
};
4.模板参数:模板参数可以是类型参数 、非类型参数 或模板参数模板
2.9. Vector 的定义,初始化,添加,扩容,删除,插入,迭代
#include <iostream>
#include <vector>
int main()
{
// 定义和初始化一个向量
std::vector<int> myVector;
// 添加元素到向量
myVector.push_back(10);
myVector.push_back(20);
myVector.push_back(30);
// 扩容向量
myVector.resize(5, 40); // 将向量大小调整为5,并将新增元素初始化为40
// 删除向量中的元素
myVector.pop_back(); // 删除最后一个元素
// 插入元素到向量的指定位置
myVector.insert(myVector.begin() + 2, 50); // 在索引为2的位置插入元素50
for (auto it = myVector.begin(); it != myVector.end(); ++it)
{
std::cout << *it << " ";
}
return 0;
}
3. 网络部分
3.1. Internet采用哪种网络协议?该协议的主要层次结构?
Internet主要采用TCP/IP协议
传输层协议(TCP )和互联网协议(IP)
主要层次结构:
应用层:用户 和互联网之间的接口
传输层:提供端到端的数据传输服务
网络层:用来寻址 和路由,将数据包从源主机传输到目标主机
数据链路层:将网络层的数据包转换为物理层的比特流
物理层:将比特流以电信号的形式传输
3.2. Internet物理地址和IP地址转换采用什么协议?
采用ARP(地址解析协议)和RARP(逆地址解析协议)
1.APR:将IP地址转换为对应的物理地址(MAC地址)
2.RARP:将物理地址解析为IP地址
但是随着技术进步,现在通常采用DHCP来分配IP地址,使用NDP协议解析
3.3. 简述交换机路由器的工作原理
交换机:通过学习目标设备的MAC地址,将数据包从一个接口转发到另一个接口,实现设备之间的直接通信。
交换机的工作原理:
学习:收到数据包,检查MAC地址;将MAC地址和数据包接口关联起来,形成MAC地址表。
转发:查找MAC地址表,找到目标设备接口,将数据包只转发给该接口,不广播所有接口。
广播:收到广播数据包时,将数据包转发到所有接口,使得局域网所有设备都能收到该数据包。
过滤:交换机可以根据设定的规则或访问控制列表过滤数据包,只允许特定的数据包通过。
路由器:用于连接不同的网络,并进行数据包的转发和路由选择。它根据目标IP地址来决定数据包的最佳路径,将数据包从源网络转发到目标网络。
路由选择:路由器根据路由表中的信息,包括目标网络的IP地址和相应的下一跳地址,来选择数据包的最佳路径。
数据包转发:当路由器接收到一个数据包时,它会检查数据包中的目标IP地址,并根据路由表选择下一跳地址。然后,路由器将数据包从一个接口转发到另一个接口,将数据包发送到下一跳路由器或目标网络。
分段和重组:如果数据包的大小超过接口的最大传输单元(MTU),路由器会将数据包分段,并在目标网络上进行重组,以确保数据的正确传输。
过滤和安全:路由器可以根据设定的规则和访问控制列表过滤数据包,提供网络安全功能,如防火墙、网络地址转换(NAT)
3.4. IP地址的编码分为哪俩部分?
网络部分:
网络部分的位数决定了网络的规模和可用的主机数量,分为(ABCDE五类)。
主机部分:
主机部分是指在同一网络中的具体设备或主机的标识,长度取决于IP地址分类。
3.5. 什么是VLAN?
虚拟局域网技术,可以将物理上分散的设备划分为 逻辑上的虚拟网络组。
通过VLAN技术,将设备分组到不同的虚拟网络中,虚拟网络相互隔离,彼此之间的通信需要经过网络设备的路由功能。
目的:
提高网络安全性
减少广播域
灵活网络管理
虚拟工作组
提高宽带利用率
3.6. TCP/IP通信建立的过程怎样,端口有什么作用?
通信建立:三次握手
第一步:客户端向服务器发送SYN同步包,请求链接
第二步:服务器收到SYN同步包后,回复SYN和ACK确认包作为响应
第三步:客户端收到SYN同步包和ACK后,回复ACK建立链接完成
断开链接:四次挥手
第一步:客户端发送FIN包,给服务器
第二步:服务器收到FIN包后,回复一个ACK给客户端
第三步:服务器希望关闭,发送FIN给客户端
第四步:客户端收到FIN包后,回复一个ACK给服务器
端口作用:用于标识应用程序或服务的数字
4. Linux部分
4.1. Linux内核引导时,从文件哪个配置文件中读取要加载的文件系统?
从/etc/fstab
文件进行挂载
4.2. Linux链接分为哪两种?
软链接(.bak):提供更大的灵活性,可以跨越文件系统,目标文件被删除后会失效。
硬链接(.link):共享磁盘空间,不能跨越文件系统 **,**在文件被删除时仍然有效。
4.3. 某文件的权限为:drw-r--r--,用数值形式表示该权限
对应数值权限为644
4.4. 在用vi编辑文件时, 如何保存修改?
wq
4.5. 常见代码版本管理程序?
Git :目前最流行的分布式版本控制系统
Subversion :集中式版本控制系统
Mercurial :一个分布式版本控制系统
Perforce :一种集中式版本控制系统,广泛用于大规模项目和团队
TFVC :Visual Studio和Team Foundation Server(TFS)一起使用
4.6. 简述linux iptables的作用?
Linux iptables是一种网络包过滤工具,用于管理和控制Linux系统的网络流量。它是一个功能强大的防火墙工具,可以允许或拒绝进出系统的网络连接,提供网络安全和访问控制。
4.7. linux上定时任务使用什么配置?
使用crontab
来进行配置和管理
编译当前crontab
文件:crontab -e
4.8. 常见的linux文本操作命令?
cat:显示文件内容
grep:用于在文件中搜索指定的模式或字符串
head:用于显示文件的前几行head -n 10 filename
tail:用于显示文件的后几行 tail -n 5 filename
wc:计算文件中的字节数 wc -l filename
4.9. 常见linux网络配置命令
ifconfig:查看网络接口信息
ip:配置和显示网络接口,路由表和地址信息,是ifconfig的替代品
ping:查看网络的延迟性和可连接性
iptables:网络包过滤器,相当于防火墙
5. 单片机部分
5.1. 单片机I/O口有什么作用?I/0口的驱动能力?上拉电阻与下拉电阻的作用?
单片机I/O口作用:
与外部设备进行数据交换的接口;用来输入外部信号或从单片机输出控制信号到外部设备。常见作用:输入,输出,通信接口,定时器和计数器,中断,数据存储
I/0口的驱动能力:
能够输出或驱动的电流或功率的能力;影响元素:输出电流能力,输出电压能力, 引脚类型,供电电压
上拉电阻:
上拉电阻连接到输入引脚和正电源之间,通常是一个较大的电阻。无外部信号,将电平置为高电平
下拉电阻:
下拉电阻连接到输入引脚和地之间,同样也是一个较大的电阻。无外部信号,将电平置为低电平
5.2. 单片机常见的寻址方式
立即寻址:指令中的操作数是一个固定的常数或字面值
直接寻址:指令中的操作数是一个内存地址 ,指令将直接使用该地址访问存储器
寄存器寻址:指令中的操作数是一个寄存器的值 ,指令将直接使用寄存器中的数据作为操作数
间接寻址:指令中的操作数是一个存储器地址的值,指令将使用该值作为间接地址来访问存储器中的数据
寄存器间接寻址:指令中的操作数是一个寄存器的值 ,但该寄存器中存储的是一个地址
相对寻址:指令中的操作数是相对于指令地址的偏移量,指令将使用该偏移量来计算目标地址、
5.3. 看门狗的原理?
用于监控系统的运行状态。
原理:
看门狗定时器:以独立的时钟运行
系统状态监测:系统正常运行时,会重置看门狗
定时器溢出:出现故障不会重置定时器,触发溢出中断
中断触发:当看门狗定时器溢出中断被触发时,系统中断处理程序将被执行,看门狗会采取适当的处理方式
5.4. 复位时单片机有什么动作?
共5步:
- 清除寄存器:将寄存器清零或设为默认值
- 复位向量跳转:根据复位向量进行跳转,跳转到程序起始点
- 执行启动代码:开发商和芯片制造商提供,用来配置时钟,外设和中断
- 系统初始化:单片机会进行系统初始化,包括设置默认的操作模式、中断向量表、堆栈指针等。
- 启动主程序:单片机会跳转到主程序的入口点,开始执行用户编写的应用程序
5.5. 中断的响应过程?
产生中断事件
单片机响应中断:保存当前状态,压栈保存现场,跳转到中断向量表
进行中断处理服务:根据中断函数进行相应的中断处理
中断处理完成:跳出中断处理函数,恢复现场
回到原本任务,继续主任务
5.6. 中断嵌套的好处与坏处?
好处:
1.实时响应:实现对多个优先级不同的中断请求的实时响应
2.多任务处理:中断嵌套允许在处理一个中断时,接受和处理其他中断请求
3.硬件资源利用:硬件资源可能被多个中断共享
4.系统灵活性:中断嵌套可以根据需求动态地调整中断的优先级和响应顺序
坏处:
1.复杂度高
2.响应时间不可预测
- 系统资源争用
4.调试困难
5.7. 什么是可重入型函数,使用时需要注意哪些问题?
可重入型函数是指可以被多个任务或线程同时调用而不会产生冲突或竞争条件的函数。
注意事项:
- 共享数据:可重入型函数应避免使用静态变量或全局变量
- 不可重入函数的调用:在可重入型函数内部,应避免调用不可重入函数
- 信号处理:在信号处理函数中,应该只调用可重入型函数
- 临界区保护:在可重入型函数中,对于访问共享资源的临界区,需要使用临界区保护机制
- 局部变量和堆栈:可重入型函数应该尽量使用局部变量和栈空间
5.8. 单片机常用接口总线?
I2C,UART,CAN,SPI
5.9. Cortex-M3的提供的流水线是几级?
三级流水线。指令取指(IF),指令解码(ID),执行(EX)
5.10. 什么是PWM
PWM代表脉冲宽度调制,用于调节电子设备中的电压或电流。
通过调整脉冲宽度的占空比 ,可以在不改变输出频率 的情况下,实现不同的平均功率输出。
5.11. 简述DMA控制器
DMA控制器可以通过直接访问系统内存,绕过CPU,实现设备之间的数据传输,从而减轻CPU的负担,提高系统性能。
主要功能:
数据传输: 它可以在设备的请求下,从设备读取数据并将其直接写入内存
寻址和计数:DMA控制器负责管理数据传输的源地址和目的地址,以及传输的数据量。它可以根据配置的寄存器中的设置,自动递增或递减地址,并在达到预定的数据量后停止传输
控制和协调:DMA控制器可以根据设备的需求,控制数据传输的开始、暂停和停止
缓冲和缓存管理:DMA控制器可以管理数据的缓冲区和缓存,以提高数据传输的效率